DataMuseum.dk

Presents historical artifacts from the history of:

RC4000/8000/9000

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about RC4000/8000/9000

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download

⟦24d244e60⟧ TextFile

    Length: 168192 (0x29100)
    Types: TextFile
    Names: »tjob«

Derivation

└─⟦00964e8f7⟧ Bits:30007478 RC8000 Dump tape fra HCØ.
    └─⟦b2ec5d50f⟧ 
        └─⟦0b92c64d5⟧ »ctb« 
            └─⟦this⟧ 

TextFile

(bjob = set 1 disc
bjob = slang proc.options proc.jobdescr 
scope user bjob
print bjob integer words.4 0.6
)

b.  w.
p.1

; kll 27.12.72                    boss 2, psjob i/o  ...1...
s0=0, s1=1
; job creates the following boss2 codepages:
;  -pseudojob io page-
;  -pseudojob auxiliary page-
;  -pseudojob break page-
;  -psjobfinis page-
s. h5 w.           ; the h-names are used for initialization only
h4, h5             ;
   78 06 12, 130   ; version id:
m.          boss 2  tjob


; This page is code page for psjob during run of job and it
; contains the central waiting point. This page contains 
; actions for all input and output messages sent by the job.
; Page 1 describes the page used by nextline, page 3 is used
; for a virtual buffer and page 4 contains the address of the 
; operation.
;
; If a job controlled reader message is received, then psjob
; jumps to a special page.

; Content:
;
;   label    page     name
;
;   c0       16       bytes transferred
;   c1       4        central wait
;   c2       7        primary input
;   c3       8        primary output
;   c4       9        normal answer
;   c5       9        rejected
;   c6       9        unintelligeable
;   c7       10       job controlled printer
;   c8       15       job controlled tape reader
;   c9       15       output
;   c10      15       input
;   c11      16       move buffer part
;   c12      17       check addresses
;   c13      17       init
;   c14      5        end medium prim output
;   c15      5        hard error prim input
;   c16      5        input exhausted
;   c17      5        call mounter
;   c18      5        call break 
;   c19      5        call aux actions
;   c20      5        call load
;   c21      15       sense
;   c22      5        alarm
;   c23      15       job controlled card reader
;   c24      5        call finis
;   c25      5        call private account
;   c26      11       conversational input
;   c27      12       start job
;   c28      12       stop job
;   c29      12       banker
;   c30      16       move
;   c31      13       call process eq
;   c32      9        normal answer job opened
;   c33      14       normal answer (bytes transferred)
s. b310, g30  w.       ;

\f



; kll 27.12.72                    boss 2, psjob i/o   ...2...

  b2.,  b3.,  b4.,  b5.,  b6.,  b7.,  b8.,  b9., b10.,  
b11., b20., b21., b22.
b23., b24., b25., b26., b27., b28., b29.,  b38.
b39., b40., b41., b42., b43., b44., b45., b46., b47., b48.
b49., b50., b51., b52., b53., b54., b55., b56., b57., b58.
b59., b60., b61., b62., b63., b64., b65., b66., b67., b68.
b69., b70., b71., b72., b73., b74., b75., b76., b77., b78.
b79., b80., b81., b82., b83., b84., b85., b86., b87., b90., b91.
b92., b93., b94., b95., b96., b97., b98., b99., b100.,b101.
b102.,b103.,b104.,b105.,b106.,b107.,b110.,b111.,b112.,b113.
b108.,b109.,b114.,b115.,b116.,b117.,b118.,b119.
b132.,            b135.,b136.,                 b140.
      b142.,b143.,b144.,b145.,b149.,b150.,b151.
b152.,b153.,b154.,b155.,b156.,b157.,b158.,b159.,b160.,b161.
b162.,b163.,b164.,b165.,b166.,b167.,b168.,b169.,b170.,b171.
b172.,b173.,b174.,b175.,b176.,b177.,b178.,b179.,b180.,b181.
b182.,b183.,b184.,b185.,b186.,b187.,b188.,b189.,b190.,b191.
b192.,b193.,b194.,b195.,b197.,b198.,b199.,b200.,b201.
b202.,b203.,b204.,b205.,b206.,b207.,b208.,b209.,b210.,b211.
b212.,b213.,b215.,b216.,b217.,b218.,b219.,b220.
b223.,b224.,b225.,b227.
b228.,b229.,b230.,b233.,b235.,b236.,b237.,b238.
b239.,b240.,b241.,b244.,b245.,b246.,b247.,b248.
b249.,b250.,b251.,b252.,b253.,b254.,b255.,b256.,b257.,b258.,
b259.
 b260.,b261.,b262.,b263.,b264.,b265.,b267.,b268.
b269.,b270.,b271.,b272.,b273.,b275. ,b281. 
b274.,b276.,b277.,b278.,b279.,b280.,b282.,b283.,b284.,b285.,
b286.,b287.,b288.,b289.,b290.,b291.,b292.
b293.,b294.,      b296.,b299.,b300.,b301.,b302.,b303.
h1:  h2                ;    end external list
     jl.        g12.   ;    goto init
\f

; kll 4.1.72                    boss 2, psjob i/o   ...3...


b. c50  w.             ;
b0:     0, r.5         ; page addresses
     40<12 + 0         ; page ident:  psjob io
b244:   1              ; send and wait
b2:     2              ; send and wait fast
b3:     3              ; lock
b4:     4              ; open
b5:     5              ; lock chained
b6:     6              ; open chained
b7:     7              ; get pages
b8:     8              ; page jump
b9:     26             ; current descr
b11:    34             ; w0 call
b119:   67             ; banker que
; answer:
b12:    0              ; status
b13:    0              ; bytes transferred
b14:    0              ; characters
b15:    0              ; position
; input message:
b120:     3<12, 0      ;
b121:     0            ;
; output message:
b16:    5<12           ; 
b17:    0              ; first addr, saved return from c36
b18:    0              ; last addr
b19:    0              ; segment

; points:
b20:    442            ; job controlled tape read
b21:    443            ; 
b22:    444            ; job controlled card read
b23:    445            ;
b28:    157            ; next line
b29:    158            ;

; job controlled printer:
b24:    383            ; start virt buf
b25:    384            ; top virt buf
b26:    60             ; empty
b27:    61             ; full

\f


; kll 4.4.73            boss 2, psjob i/o   ...3a...



; constants:
g18=(:e45-e44:) / 8    ; number of conversational ip
b1:     1              ; 
b32:    1<18           ; end medium
b34:     -14           ; -record length process eq
b122:     0            ; boss
b123: c.e52-1, -1,r.e52 z.; readers
b124:     0            ; printer
b125:     0            ; terminal
b126:     0            ; card reader
b127:     r.(:e19+1:)  ; process eq
b130:     r.g18+1      ; conversational ip
b128:     r.7*(:e19+g18:)+1; names , first, length of buffer -2 for process eq
b36:    999999         ; max line - 1
b222:     1<4          ; mask
b129:     -1           ; data bits
b33:  c.e52-1, -1,r.e52 z.; reader device numbers
b35:  0, r.4           ; buffer for device name

b37:    0              ; virt aux actions
b232:     g7           ;    rel rel send job printer operation
b38:    426            ;-2: virt break 
b79:    493            ; rel high priority start
b39:    313            ; virt psjob mount
b40:    312            ; virt mount table
b118:     311          ;    virt mount action table
b41:    440            ; virt load
b228:   417            ; virt finis
b10:    436            ; virt private account
b289:     472          ; virt kit on
\f


; kll 10.11.71                    boss 2, psjob i/o   ...4...


b. a20, j20  w.        ;    page 1 = jobfile page
c1:  rl  w2  x3+175    ; central wait:
     jl. w3    (b5.)   ;    lock chained(psjob que);
     rl. w2    (b9.)   ;    w2:=desc addr;
     rl  w0  x2+10     ;
     rs  w0  x2+14     ;    page 4:= page 2;
     rs. w1     b0.+8  ;    abs page 4:= operation;

     bz  w2  x1+3      ;    w2:= operation index;
     se  w2     0      ;    if message from job then
     jl.        a1.    ;    begin

     rl  w2  x1+4      ;      w2:= message addr;
j1:  rs  w2  x3+184    ;      save message addr;
     ac  w0 (x2+4)     ;
     al  w1    -2      ;
a0:  al  w1  x1+2      ;      w1:= index(receiver);
     se. w0 (x1+b122.) ;
     jl.        a0.    ;
     al  w0     0      ;    compute index
     sl  w1     b123-b122;    boss=0
     ba. w0     1      ;
     sl  w1     b124-b122;    reader=1
     ba. w0     1      ; 
     sl  w1     b125-b122;    printer=2
     ba. w0     1      ;
     sl  w1     b126-b122;    terminal=3
     ba. w0     1      ;
     ls  w1    -1     ; if index >= process eq. then
     sl  w1    (:b127-b122:)>1 ;
     jl.        c31.   ;  goto call process eq.
     rl  w1     0      ;
     bz  w0  x2+8      ;    
     sn  w0     5      ;      if output then
     jl.        c9.    ;      goto output;
     sn  w0     3      ;      if input then
     jl.        c10.   ;      goto input;
     sn  w0     0      ;      if sense then
     jl.        c21.   ;      goto sense;
     sn  w0     7      ;      if outinput then
     jl.        c41.   ;      goto outinput;
     ac  w1 (x2+4)     ;
     sn  w1    (66)    ;
     sz  w0     1      ;      if uneven or receiver <> boss then
     jl.        c6.    ;      goto unintelligible;

     ld  w1    -25     ;      w1:= function(message);
     sl  w1     a8     ;      if w1 > max func then
a11: al  w1     a7     ;      w1:= print;
     al  w2  x1+a6     ;      operation index:= w2 + message;

a1:  ls  w2     1      ;    end;
     rl. w3     b0.+2  ;
j2:  rl  w0  x3+177    ;
     bz. w1  x2+a2.    ;
     bz. w3  x2+a3.    ;    w3:= jump(operation index);
     rl. w2    (b9.)   ;    w2:= current descr;
     se  w1     c20    ;    if action <> load then
     rs  w0  x2+8      ;    page 1:= job descr;
     jl.     x1+b0.    ;    goto operation index action;

\f



; kll 29.3.72                    boss 2, psjob i/o   ...5...


; answer not sent, chain not zero, job locked in core.
c14: rl  w2  x3+184    ; end medium prim output:
     jl. w1     c36.   ;    adjust primout;
     am        -1      ;

c16: am        -1      ; input exhausted:
c15: al  w2     a9     ; hard error prim input:
j3:  rs  w2  x3+182    ;    save cause;
j4:  rl  w2  x3+176    ; 
     jl. w3    (b4.)   ;    open(job in core);
j5:  rl  w2  x3+182    ;
     jl.        a1.    ;    goto action(cause);

b42=c1+1, b43=j1+1, b44=j2+1, b108=j3+1, b109=j4+1, b114=j5+1
b280=c14+1


c17=k-b0               ;
     dl. w1     b118.  ; call mounter:
     rx  w0  x2+8      ;    page 1:= mount table;
     ds  w1  x2+14     ;    page 3:= job descr; page 4:= action table;
     am         b39-b289;
c39=k-b0               ; call kit on:
     am         b289-b38;
c18=k-b0               ; call break :
     am         b38-b228;
c24=k-b0               ; call finis:
     am         b228-b10;
c25=k-b0               ; call private account:
     am          b10-b37;
c19=k-b0               ; call aux actions:
     am         b37-b41;
a12: rl. w2     b41.   ; call load:
     jl.       (b8.)   ;    page jump;
c.-1, o48, z.          ;    (bossfault xref)

c22=k-b0, jd-48        ; alarm:


c20=k-b0               ; test load:
     rl. w2     b0.+8  ;    (notice: at entry w3 = 0 .....)
     rl  w2  x2+4      ;    w2 := message buffer address;
     rl  w3     66     ;
     dl  w1  x3+74     ;    w0,w1:=boss max cat base
     ba. w0     1      ;    w0:=low max base + 1
     al  w3     0      ;
     rs. w3     b35.   ;
     al. w3     b35.   ;    w3:=ref zero name (for set cat base)
     jd         1<11+72;    set catalog base
     dl  w1  x2+8+10   ;    move device name
     ds. w1     b35.+2 ;      from loadmessage
     dl  w1  x2+8+14   ;      to local name buffer 
     ds. w1     b35.+6 ;
     jd         1<11+4 ;     get process description of pseudoprocess
     sn. w0    (b126.) ;    if pseudocardreader
     jl.        b101.  ;    then loadmessage is ok
     al. w3     b123.-2;    w3:=first of pseudoreaders-2
a10: al  w3  x3+2      ;    w3:=next pseudoreader
     sl. w3     b124.  ;    if top of table then
     jl.        a11.   ;    goto print
     se  w0 (x3)       ;    if pseudoprocess does not match 
     jl.        a10.   ;    then continue
     rl  w0  x3+b33-b123;   w0:=device number of actual reader
     sl. w3     b123.+e55<1;  if exclusive device then
     ac  w0    (0)     ;    device no := - device no
     rl. w3     b0.+2  ;    w3:= abs ref page 1 (job file page)
b299=k+1
     rs  w0  x3+518    ;    save temporarily the device number on job file page
b101=k+1
     al  w3     441    ; name is ok: w3 := relative entry of load;
     jl.        a12.   ;    call load;

\f



; kll 27.12.72                    boss 2, psjob i/o   ...6...
; job io state (byte)  job file rel ext(179)+1:
;      1<0    job card
;      1<1    job printer
;      1<2    job reader
;      1<3    off line
;      1<4    job printer used
;      1<5    no conversation
;      1<6    job printer accounted


h. a2=k-2, a3=k-1
a4:        b90=k+1,  c17, 319  ; tape ready
           b91=k+1,  c18, 351  ; user kill
           b92=k+1,  c18, 352  ; operator kill
                     c19, g9   ; answer
           b93=k+1,  c18, 353  ; time up
                     c22, 0    ; internal
                     c22, 0    ; run
                     c22, 0    ; go
                     c19, g10  ; submit
                     c22, 0    ; convert from commandio
           b290=k+1, c39, 470  ; kit on
                     c22, 0    ; card job
                     c22, 0    ; tre job
                     c22, 0    ; trf job
                     c22, 0    ; replace operation
                     c24, h3   ; harderror swopin from banker
a5=k-2, a6=(:k-a4:)>1          ;
           b94=k+1,  c24, 354  ; finis
           b95=k+1,  c18, 355  ; break
                     c19, g6   ; hard error
           b117=k+1, c25, 433  ; private account
           b96=k+1,  c18, 356  ; replace
                     c19, g4   ; new job
           b97=k+1,  c17, 316  ; mount tape
a7=(:k-a5:)>1,       c19, g5   ; print
           b98=k+1,  c17, 315  ; mount ring
           b99=k+1,  c17, 317  ; suspend
           b100=k+1, c17, 318  ; release
                     c20, 0    ; load
                     c19, g11  ; change paper
           b102=k+1, c18, 357  ; timer
                     c19, g8   ; convert
           b103=k+1, c17, 314  ; mount special
                     c19, g17  ; mount kit
           b255=k+1, c18, 481  ; corelock
           b256=k+1, c18, 482  ; coreopen
                     c19, g21  ;40 no parent message (only from strangers)
           b227=k+1, c18, 362  ;42 swop and wait
                     c19, g21  ;44 mount and position tape
                     c19, g21  ;46 close tape
                     c19, g20  ;48 unused
                     c19, g22  ;50 general device (telex)
a8=(:k-a5:)>1                  ;
           b106=k+1, c24, 360  ; end medium prim output
           b104=k+1, c18, 358  ; input exhausted
           b105=k+1, c18, 359  ; hard error prim input
a9=(:k-a4:)>1                w.;

e.                             ;
\f


; kll 10.11.71                    boss 2, psjob i/o   ...7...


b. j9  w.              ;

; Primary input:
; w2 = mess addr

c2:  jl. w1     c12.   ;    check addresses;

     rl  w1  x2+10     ;
     al  w1  x1-2      ;    base store rel:= first addr of mess - 2;
     rl  w0  x2+12     ;
j1:  ds  w1  x3+187    ;    last store rel:= last addr of mess;

j2:  rl  w2  x3+176    ;
     jl. w3    (b3.)   ;    lock(job in core);

j0:  rl  w0  x3+189    ;
     rl. w2    (b9.)   ;    page 3:= work page;
     rs  w0  x2+12     ;
j8:  al  w0  x3+257    ;    abs ref return point;
     dl. w3     b29.   ;
     jl. w1    (b11.)  ;    w0 call(nextline);
     jl.        c15.   ;    hard error prim input
     am         0      ;    long line
                       ;    normal
j3:  rl  w1  x3+187    ;
j4:  rl  w2  x3+184    ;    w2:= message addr;
     ws  w1  x2+10     ;    w0:= bytes transferred:=
     al  w0  x1+2      ;    base store rel - first addr + 2;
     rs. w0     b13.   ;
j7:  rl  w0  x3+190    ;
     rs. w0     b15.   ;    position:= line got;

     sh. w0    (b36.)  ;    if position > max line then
     jl.        c4.    ;    begin
j5:  rl  w1  x3+180    ;
     al  w1  x1+1      ;      exhaust count:= exhaust count + 1;
j6:  rs  w1  x3+180    ;
     sl  w1     6      ;      if exhaust count > 5 then
     jl.        c16.   ;      goto input exhausted;
     rl. w0     b32.   ; 
     rs. w0     b12.   ;      status:= end medium;
     jl.        c4.    ;    end;
                       ;
                       ;    goto normal answer;

b45 = j1+1, b46 = j2+1, b47 = j3+1, b48 = j4+1, b49 = j5+1
b50 = j6+1, b66=j0+1, b115=j7+1, b116=j8+1

e.                     ;
\f


; kll 15.10.71                    boss 2, psjob i/o   ...8...


b. a2, j10  w.         ;

; Primary output:
; w2 = message addr
; comment job index rel 192 used as work in c31

c3:  al  w3  x3+191    ;    w3:= record;
     jl. w1     c13.   ;    init;
j1:  rl  w2  x3+184    ;    w2:= message addr;

a1:  al  w3  x3+191    ; next buffer part:   w3:= record;
     jl. w1     c11.   ;    move buffer part;
     rl. w3     b0.+2  ;    w3:= page 1;

j2:  rl  w0  x3+191    ;
     se  w0     0      ;    if rest = 0 then
     jl.        a2.    ;    begin

     rl. w1     b0.+6  ;      first addr:= page 3 abs;
     al  w2  x1+510    ;      last addr:= first addr + 510;
     ds. w2     b18.   ;
j3:  rl  w1  x3+194    ;
     ls  w1    -9      ;
     rs. w1     b19.   ;      segment:= first buf byte > 9;

     al. w1     b16.   ;      w1:= message;
j4:  al  w2  x3+195    ;      w2:= name of superbuffer;
     jl. w3    (b2.)   ;      send and wait fast;

     sz  w0  -1-1<5-1<1;      if logical status <> normal answer or not exist then
c.-1, o40, z.          ;    (bossfault xref)
     jd        -40     ;      alarm;
     al  w1     512    ;
j6:  wa  w1  x3+194    ;      
j8:  sl  w1 (x3+196)   ;      if first buf byte >= length then
     jl.        c14.   ;      goto end medium prim output;
j7:  rs  w1  x3+194    ;      first buf byte:= first buf byte + 512;
     al  w0     512    ;
j5:  rs  w0  x3+191    ;    rest:= 512;
                       ;    end;
a2:  rl  w2  x3+184    ;    w2:= message addr;
     rl  w1  x2+12     ;
j9:  sl  w1 (x3+192)   ;    if last addr >= job index then
     jl.        a1.    ;    goto next buffer part;
     jl. w1     c36.   ;    adjust primout;
     jl.        c4.    ;    goto normal answer;

b51 =  c3+1, b52 = j1+1, b53 = a1+1, b54 = j2+1, b55 = j3+1, b56 = j4+1
b57 = j5+1, b58 = j6+1, b59 = j7+1, b60 = j8+1, b61 = a2+1, b62 = j9+1

e.                     ;
\f


; kll 30.11.71                    boss 2, psjob i/o   ...9...


b. j7  w.              ;
c36: rs. w1     b17.   ; adjust primout:

j1:  rl  w0  x3+192    ;
     jl. w1     c0.    ;    bytes transfered(job index);

j2:  rl  w0  x3+179    ;
     sz  w0     1<3    ;    if offline then
     jl.       (b17.)  ;    goto return;

j3:  rl  w2  x3+197    ;
     jl. w3    (b4.)   ;    open(terminal full);

     rl. w1     b13.   ;
     ls  w1    -1      ;    w1:= bytes transfered//2-1;
     al  w1  x1-1      ;
j5:  wa  w1 (x3+197)   ;
j6:  rs  w1 (x3+197)   ;    terminal full:= terminal full + w1;
     jl.       (b17.)  ;    return;


c4:  rl  w2  x3+176    ; normal answer:
     jl. w3    (b4.)   ;    open(job in core);
     am        -1      ;
c5:  am        -1      ; rejected:
c6:  al  w0     3      ; unintelligible:

     rl. w1     b13.   ;
rl.w2b12.,jd-1
     ls  w1    -1      ;
     wa. w1     b13.   ;    characters transferred:=
     rs. w1     b14.   ;    bytes transferred// 2 * 3;
     rl. w1    (b9.)   ;
     al  w2     0      ;
     rs  w2  x1+12     ;    page 3:= 0;
     rl. w1     b0.+8  ;    w2:= message(sender table);
     rx  w2  x1+4      ;    message(sender table):= 0;
     al. w1     b12.   ;    w1:= answer;
     sl  w2     2      ;    if message pending then
     jd         1<11+22;    send answer;

     al  w0     0      ;
     rs. w0     b12.   ;    status:= 0;

     jl.        c1.    ;    goto central wait;

b63 = j1+1, b64 = j2+1, b65 = j3+1,  b67 = j5+1, b68 = j6+1
b69 = c4+1

e.                     ;
\f


; kll 4.1.72                    boss 2, psjob i/o   ...10...

b. a2, j11  w.          ;

; w2 = message addr

c7:  rl  w0  x3+179    ; job controlled printer:
jd-1
     so  w0     1<1    ;    if not allowed then
     jl.        c5.    ;    goto rejected;
     sz  w0     1<4    ;    if not job printer used
     jl.        a0.    ;    begin
     lo. w0     b222.  ;      (1<4);  
j0:  rs  w0  x3+179    ;      jobprinter used:= true;  
     rl. w1    (b9.)   ;
j7:  rl  w0  x3+177    ;      page 1:= job descr page;
     rx  w0  x1+8      ;      page 3:= job file page;
     rs  w0  x1+12     ;
     dl. w3     b232.  ;
     jl.       (b8.)   ;      page jump(send job printer operation);
                       ;    end return to c7;
a0:                    ;
j10: rl  w2  x3+184    ;    w2:=ref message

j1:  al  w3  x3+181    ;    w3:= record;
     jl. w1     c13.   ;    init;
j2:  rl  w2  x3+184    ;    w2:= message addr;

a1:  al  w3  x3+181    ; next buffer part:   w3:= record;
     jl. w1     c11.   ;    move buffer part;

     rl. w3     b0.+2  ;    w3:= page 1;
j3:  rl  w0  x3+181    ;
     se  w0     0      ;    if rest = 0 then
     jl.        a2.    ;    begin
     al  w0     512    ;
j4:  rs  w0  x3+181    ;      rest:= 512;

     rl. w2     b27.   ;
     jl. w3    (b4.)   ;      open(full);
     rl. w0    (b26.)  ;
     sn  w0     0      ;      if empty then
     jl.      c37.,c38:;      wait for empty;

j5:  rl  w2  x3+183    ;
     al  w2  x2+512    ;      get:= get + 512;
     sl. w2    (b25.)  ;      if get >= top then
     rl. w2     b24.   ;      get:= start;
j6:  rs  w2  x3+183    ;
     rl. w1    (b9.)   ;      w1:= desc;
     rs  w2  x1+12     ;      page 3:= get;
     rl. w2     b26.   ;
     jl. w3    (b3.)   ;      lock(empty);
                       ;    end;
a2:  rl  w2  x3+184    ;    w2:= message addr;
     rl  w0  x2+12     ;
j8:  sl  w0 (x3+182)   ;    if last addr >= job index then
     jl.        a1.    ;    goto next buffer part;

j9:  rl  w0  x3+182    ;
     jl. w1     c0.    ;    bytes transfered(job index);

     jl.        c4.    ;    goto normal answer;

b71 =  c7+1, b72 = j1+1, b73 = j2+1, b74 = a1+1, b75 = j3+1, b76 = j4+1
b77 = j5+1, b78 = j6+1, b80 = a2+1, b81 = j8+1, b82 = j9+1, b233 = j7+1
b223= j0+1, b259=j10+1

e.                     ;
\f


; boj 30.6.72                  boss 2,psjob io   ...10.a...


c37:                   ; bracket:
; wait for empty shares, return to c38
b. a9,j9 w.

j0:  rl  w0  x3+177    ;
     rl. w1    (b9.)   ;
     rs  w0  x1+12     ;    page 3:= job descr;
     jl. w3    (b7.)   ;    get pages;
j3:  rl  w2  x3+176    ;
     jl. w3    (b4.)   ;    open(job in core);
     jl. w3     c28.   ;    stop job;
     rl. w1    (b9.)   ;
     al  w0     0      ;    page 1:=0;
     rs  w0  x1+8      ;
     rl. w1     b0.+6  ;    w1:=ref page 3;
     al  w0     0      ;    for w0:=
a1:  ba. w0     1      ;    1 step 1
     sl  w0   1+i67-i77;    until i67-i77
     jl.        a0.    ;    do begin

     rs  w0   x1+2      ;
     rl. w2     b26.   ;
     jl. w3    (b3.)   ;      lock(empty);
     rl. w1     b0.+6  ;      w1:=ref page 3;
     rl  w0  x1+2      ;
     jl.        a1.    ;    end;
a0:  al  w0     i67-i77;
     wa. w0    (b26.)  ;    empty:=empty+i67-i77;
     rs. w0    (b26.)  ;

     rl. w2     b0.+6  ;    w2:=ref page 3;
     rl. w1    (b9.)   ;    w1:=ref own desc;
j1:  rl  w0  x2+338    ;
     rs  w0  x1+8      ;    page1:=job file page;
     jl. w3     c27.   ;    start job;
j2:  rl  w2  x3+176    ;
     jl. w3    (b3.)   ;    lock(job in core);
     jl.        c38.   ;    return;

b282=j0+1, b283=j1+1, b284=j2+1, b285=j3+1

e.

\f



; kll 27.12.72                    boss 2, psjob i/o   ...11...


b. d10  w.             ;
; work variables on descr page:
d0=4   ;  answer and result     18 bytes
d1=22  ;  rel return from banker 2 bytes
d2=24  ;  new message           16 bytes
b. a9, j19  w.         ;

c26: rl  w0  x3+179    ; conversational input:
     sz  w0     1<3+1<5;    if offline or no conversation then
     jl.        c5.    ;    goto rejected;
     jl. w1     c12.   ;    check addr;

     rl. w1    (b9.)   ;
j1:  rl  w0  x3+177    ;
     rs  w0  x1+12     ;    page 3:= job descr page;
     jl. w3    (b7.)   ;    get pages;
     rl. w1     b0.+6  ;    w1:=job descr page
     al  w0     1      ;
j6:  ba  w0  x1+375    ;    increase no of input lines;
     se  w0    -2      ;    at most 4093 lines;
j7:  hs  w0  x1+375    ;
     jl. w3     c28.   ;    stop job;

j2:  rl  w2  x3+306    ;
     jl. w3    (b3.)   ;    lock(input);
j5:  rl  w2  x3+221    ;
     jl. w3    (b3.)   ;      lock(terminal)
j3:  rl  w0  x3+299    ;
     se  w0     1      ;    if terminal state = killed then
     jl.        a1.    ;    begin
j9:  rl  w2  x3+221    ;
     jl. w3    (b4.)   ;      open(terminal);
j4:  rl  w2  x3+306    ; 
     jl. w3    (b4.)   ;      open(input);
     jl. w3     c27.   ;      start job;
     jl.        c1.    ;      goto wait;
a1:                    ;    end;
     jl. w3     c27.   ;    start job;
     al  w2    -1      ;    index:= -1;
     jl.        c32.   ;    goto simulate message;

b235 = c26+1,b236 = j1+1, b237 = j2+1, b238 = j3+1, b239 = j4+1
b240 = j5+1,  b254=j9+1
b258 = j6+1,  b257=j7+1

e.                     ;

\f



; kll 27.12.72                    boss 2, psjob i/o   ...12...


b. a9, j19  w.         ;

c35: rs. w3     b13.   ; copy answer :  save return;
     al  w3     0      ;
     so  w0     1<1    ;    if not normal answer then
     rs  w3  x1+2      ;    bytes transferred:= 0;
     al  w2  x1        ;    from addr:= message;
     rl. w1     b0.+6  ;    to addr:= answer and result on descr;
     al  w1  x1+d0     ;
     al  w0     18     ;    move bytes:= 18;
     jl. w3     c30.   ;    move;
     jl.        (b13.) ;    return

c27: rl. w1    (b9.)   ; start job:
     rl  w1  x1+12     ;
j6:  al  w1  x1+325    ;    w1:= virt dump area spec;
     am        -1      ;    w0:= code:= start job;

c28: al  w0     17     ; stop job:   w0:= code:= stop job;

c29: ws. w3     b0.    ; banker(w0, w1):
     rl. w2     b0.+6  ;    save rel return;
     rs  w3  x2+d1     ;
j7:  rs  w1  x2+349    ;    param:= w1;
j8:  al  w1  x2+335    ;    w1:= banker operation;
     hs  w0  x1+2      ;    code:= w0;
     rl. w2     b119.  ;    w2:= banker que;
     jl. w3    (b6.)   ;    open chained;
     rl. w2     b0.+6  ;
     rl  w3  x2+d1     ;    return:= rel return + page start;
     wa. w3     b0.    ;
j9:  rl  w2  x2+334    ;    w2:= answer sem;
     jl.       (b3.)   ;    lock(w2);


b249 = j6+1, b250 = j7+1, b251 = j8+1, b252 = j9+1
e.

\f



; kll 29.3.72                    boss 2, psjob i/o   ...13...

; w1 = index, w2 = message, w3 = jobfile.


c31:                   ; process eq:
b. a9, j19  w.         ;
     al  w1 x1-(:b127-b122:)>1;
j1:  rs  w1  x3+192    ;    index:= rel process eq nr;
j2:  rl  w0  x3+177    ;
     rl. w1    (b9.)   ;    page 3:= job descr;
     rs  w0  x1+12     ;
     jl. w3    (b7.)   ;    get pages;

j3:  ac  w2 (x3+192)   ;    w2:= - index;
     sh  w2    -(:b130-b127:)>1; if ip then
     jl.        a0.    ;      ok else
     am.       (b0.+6) ;    w0.w1:= device word shift
j8:  dl  w1    +340    ;    devices - rel of first process eq - index;
     ld  w1  x2+e17-e18+e24;
     sl  w0     0      ;    if device not reserved then
     jl.        c5.    ;    goto rejected;
a0:  wm. w2     b34.   ;

c32:                   ; simulate message: (entry from conversational)
j4:  rs  w2  x3+192    ;    index:= index * record length;

j5:  rl  w2  x3+184    ;    w2:= from addr;
     al  w2  x2+8      ;
     am.       (b0.+6) ;
     al  w1    +d2     ;    to addr:= new message;
     al  w0     16     ;    move bytes:= 16;
     jl. w3     c30.   ;    move;
     rl. w3     b0.+2  ;
j7:  rl  w2  x3+184    ;    w2:= old message;
     bz  w0  x2+8      ;
     so  w0     1      ;    if message code odd then
     jl.        a1.    ;    begin
 
     jl. w1     c12.   ;      check addresses;
j6:  rl  w1  x3+192    ;      w1:= index;
j9:  rl  w0  x3+178    ;      if conversational then terminal buf
     sl  w1     0      ;      else process buf;
     rl. w0  x1+b128.+10;
     am.       (b0.+6) ;      first of new message:=
     rs  w0  d2+2      ;      first of buffer;

     rl  w0  x2+12     ;      diff:= last - first in old message;
     ws  w0  x2+10     ;    
     sl  w1     0      ;      if conversational then
     jl.        a2.    ;        begin
     sl  w0     i3-1   ;        if diff > term buf then
     al  w0     i3-2   ;          diff:=term buf length - 2;
     jl.        a3.    ;        end
a2:                    ;      else
     sl. w0 (x1+b128.+12);    if diff > length(index) - 2 then
     rl. w0  x1+b128.+12;     diff:= length(index) - 2;
a3:  rl. w1     b0.+6  ;
     wa  w0  x1+d2+2   ;      last of new message:= first + diff;
     rs  w0  x1+d2+4   ;    end;
a1:                    ;

b260 = j1+1, b261 = j2+1, b262 = j3+1, b263 = j4+1
b264 = j5+1, b265 = j6+1, b281 = j7+1, b275 = j8+1, b253 = j9+1
e.                     ;


\f



; kll 27.12.72                    boss 2, psjob i/o   ...14...

b. a9, j19  w.         ;
     
     bz  w0  x2+8      ;
     so  w0     5      ;    if message code = output or 7 then
     jl.        a2.    ;    begin
j1:  rl  w2  x3+176    ;
     jl. w3    (b3.)   ;      lock(job in core);
     am.       (b0.+6) ;
     dl  w2    +d2+4   ;      w1:= to:= first in new message;
     ws  w2     2      ;   
     al  w0  x2+2      ;      w0:= move bytes:= last - first in new + 2;
j2:  rl  w2  x3+184    ;
     rl  w2  x2+10     ;      w2:= from:= first in old message;
     jl. w3     c30.   ;      move;

     rl. w3     b0.+2  ;     
j3:  rl  w2  x3+176    ;      open(job in core);
     jl. w3    (b4.)   ;    end;

a2:  jl. w3     c28.   ;    stop job;
j4:  rl  w1  x3+192    ; 
j8:  al  w2  x3+300    ;    if conversational then
     sl  w1     0      ;    w2:=terminal name else
     al. w2  x1+b128.  ;    w2:= name(index);
     rl. w1     b0.+6  ;
     al  w1  x1+d2     ;    w1:= message on descr;
     jl. w3    (b244.) ;    send and wait;
     jl. w3     c35.   ;    copy answer ;
     rl. w1    (b9.)   ;
     rl  w0  x1+12     ;    page 1 := job descr page;
     rs  w0  x1+8      ;
     rl. w3     b0.+6  ;
     al  w0  x3+2      ;    return on job descr page +0+2;
     dl. w3     b79.   ;
     jl. w1    (b11.)  ;    w0-call(high priority start);

j5:  rl  w2  x3+184    ;
     bz  w0  x2+8      ;    if message code = input or 7 then
     so  w0     3      ; 
     jl.        c34.   ;    begin

j6:  rl  w2  x3+176    ;
     jl. w3    (b3.)   ;      lock(job in core);
     rl. w2     b0.+6  ;
     rl  w0  x2+d0+2   ;      move bytes:= bytes transferred;
     rl  w2  x2+d2+2   ;      from:= first of new message;
j7:  rl  w1  x3+184    ;   
     rl  w1  x1+10     ;      to:= first of old message;
     jl. w3     c30.   ;      move;

b267 = j1+1, b268 = j2+1, b269 = j3+1, b270 = j4+1
b271 = j5+1, b272 = j6+1, b273 = j7+1
b245 = j8+1
e.                   ;

\f



; kll 15.5.72                    boss 2, psjob i/o   ...15...

b. a9, j9 w.


c33: rl. w3     b0.+2  ; answer exactly:  w3:= job file;
b279=k+1
     rl  w2  x3+176    ;      open(job in core);
     jl. w3    (b4.)   ;    end;
c34:
j0:  rl  w1  x3+192    ;    if conversational then
     sl  w1     0      ;     begin
     jl.        a1.    ;  
j1:  rl  w2  x3+221    ;      open (terminal) ;
     jl. w3    (b4.)   ;    
j2:  rl  w2  x3+306    ;      open(input);
     jl. w3    (b4.)   ;      end;
a1:
     rl. w1    (b9.)   ;    w1:=current corutine;
     al  w2     0      ;
     rs  w2  x1+12     ;    page 3 descr := 0;
     rl. w1     b0.+8  ;    w1:=sender table addr;
     rx  w2  x1+4      ;    w2:=message addr; enable next mess;
     rl. w3     b0.+6  ;    w3:=job descr;
     al  w1  x3+d0     ;    w1:=answer addr;
     rl  w0  x3+d0+16  ;    w0:=result;
     jd      1<11+22   ;    send answer;
     rl. w3     b0.+2  ;    w3:= job file;
     jl.        c1.    ;    goto central wait;

b246=j0+1, b247=j1+1, b248=j2+1
e.
e.                     ;    end d-names;
\f


; re 75.06.19                     boss 2, psjob i/o   ...15a...

b. a5, j5  w.          ;

c8:  jl. w1     c12.   ; job controlled tape reader:   check addr;
j1:  rl  w0  x3+179    ; sense:
     so  w0     1<2    ;    if not allowed then
     jl.        c5.    ;    goto rejected;
     dl. w3     b21.   ;
     jl.       (b8.)   ;    page jump(job tape);

c23: jl. w1     c12.   ; job controlled card reader:   check addr;
j2:  rl  w0  x3+179    ; sense:
     so  w0     1<0    ;    if not allowed then
     jl.        c5.    ;    goto rejected;
     dl. w3     b23.   ;
     jl.       (b8.)   ;    page jump(job card);


;    boss         reader       printer      terminal     card reader
h.

a1:  c4-b0,       c8-b0+2,     c4-b0,       c4-b0,       c23-b0+2   ; sense

a2:  c2-b0,       c8-b0,       c6-b0,       c26-b0,      c23-b0     ; input

a3:  c3-b0,       c6-b0,       c7-b0,       c26-b0,      c6-b0      ; output

a4:  c6-b0,       c6-b0,       c6-b0,       c26-b0,      c6-b0      ; outinput

w.

; w2 = message addr

c41: am         a4-a1  ; outinput:
c21: am         a1-a2  ; sense:
c10: am         a2-a3  ; input
c9:  bz. w1  x1+a3.    ; output:
     jl.     x1+b0.    ;    goto action(message code, receiver);

b83 = j1+1, b84 = j2+1

e.                     ;
\f


; kll 10.11.71                    boss 2, psjob i/o   ...16...


b. a9  w.              ;
; entry: w0 = irr, w1 = return, w2 = mess, w3 = record

c11: rs. w1     a6.    ; move buffer part:
                       ;    all registers undef at exit
     rl. w0     a7.    ;
     rs. w0     b129.  ;    data bits:= iso data bits;
     rl  w1  x2+12     ;
     ws  w1  x3+2      ;
     al  w0  x1+2      ;    w0:= move bytes:=
     sl  w0 (x3+0)     ;    min(last addr - job index + 2, rest);
     rl  w0  x3+0      ;

     rl  w2  x3+2      ;    w2:= from:= job index;
     wa  w2     0      ;    job index:= job index + move bytes;
     rx  w2  x3+2      ;

     rl  w1  x3+0      ;
     ws  w1     0      ;    w1:= rest;
     rx  w1  x3+0      ;    rest:= rest - move bytes;
     ac  w1  x1-512    ;
     wa. w1     b0.+6  ;    w1:= to:= page 3 + 512 - w1;
     rl. w3     a6.    ;    return:= saved return;

; entry:   w0 = move bytes, w1 = to addr, w2 = from, w3 = return.
c30: ds. w3     a6.    ; move:   save from, return;

     so  w0     2      ;
     a0=k-1            ;    displacement constant;
     jl.        a3.    ;    if move bytes mod 4 = 2 then
     rl  w3  x2        ;    word(to):= word(from) and
     la. w3     b129.  ;    data bits;
     rs  w3  x1        ;
a3:  bs. w0     a0.    ;
     wa  w1     0      ;    to:= to + move bytes - 2;
     wa  w2     0      ;    from:= from + move bytes - 2;

a4:  sh. w2    (a5.)   ; rep:   if from <= saved from then
     jl.        a8.    ;    goto return;
     dl  w0  x2        ;
     la. w3     b129.  ;    double(to):= data bits and
     la. w0     b129.  ;    double(from);
     ds  w0  x1        ;
     al  w1  x1-4      ;    from:= from - 4;
     al  w2  x2-4      ;    to:= to - 4;
     jl.        a4.    ;    goto rep;
a8:  al  w0    -1      ;
     rs. w0     b129.  ;    data bits:= all;
     jl.       (a6.)   ;    return;
a5:  0, a6:  0         ;
a7:  127<16+127<8+127  ; iso data bits;

c0:  rs. w1     a6.    ; bytes transfered(job index):
     lo. w0     b1.    ;    w2= message addr;
     rl  w1  x2+10     ;
     lo. w1     b1.    ;    bytes transfered:= round(job index) -
     ws  w0   2        ;
     rs. w0     b13.   ;        round(first addr);
     jl.       (a6.)   ;    goto saved return;
e.                     ;
\f


; kll 10.11.71                    boss 2, psjob i/o   ...17...


b. a3, j4  w.          ;

; check addresses:
; entry: w0 = irr, w1 = return, w2 = mess addr, w3 = page 1
; exit:  w0 = undef, w1 = undef, w2 = mess addr, w3 = page 1

c12: rs. w1     a2.    ;    save return;
     rl  w0  x2+10     ;
     jl. w1     a1.    ;    test(first in message);
     rl  w0  x2+12     ;
     jl. w1     a1.    ;    test(last in message);

     sl  w0 (x2+10)    ;    if first <= last then
     jl.       (a2.)   ;    goto return else
     jl.        c6.    ;    goto unintelligible;

a1:                    ; proc test(w0):
     sz  w0     1      ;    if w0 odd then
     jl.        c6.    ;      goto alarm;
j1:  sl  w0 (x3+185)   ;    if w0 < first of job or
j2:  sl  w0 (x3+186)   ;       w0 > last of job then
     jl.        c6.    ;    goto unintelligible;
     jl      x1        ;    goto return;

a2:             0      ;    saved return;

; init:
; entry: w0 = irr, w1 = return, w2 = mess, w3 = record
; exit:  w0 = undef, w1 = undef, w2 = undef, w3 = page 1

c13: rs. w1     a3.    ;    save return;
     rl  w0  x2+10     ;
     rs  w0  x3+2      ;    job index:= first addr;
     rl  w0  x3+4      ;
     rl. w3     b0.+2  ;    w3:= page 1;
     rl. w1    (b9.)   ;    w1:= desc;
     rs  w0  x1+12     ;    page 3:= virt addr;

     jl. w1     c12.   ;    check addresses;

j4:  rl  w2  x3+176    ;
     rl. w3     a3.    ;    return:= saved return;
     jl.       (b3.)   ;    lock(job in core);

a3:             0      ;    saved return;
b85 = j1+1, b86 = j2+1, b87 = j4+1
e.                     ;

g0=  c1-b0             ; rel entry
g1=  k-b0              ; length
g14=c7-b0              ; rel entry job printer

i.e.                   ; end of c-names
\f


; kll 4.1.72                    boss 2, psjob run init   ...18...


b. a9, f9  w.          ;

b110:     0            ;    base of external table
b111:     12           ;    reserve virt
b112:     13           ;    output virt
b113:     15           ;    end init
b274:     31           ;    init alarm;
f0:  <:printer:>, f1:0
f2:  0,r.4    ;    buffer for reader device names
f3:  <:cardreader:>
f4:  <:terminal:>, 0
f5:       -1
f6:       14
f8: <:<10>e18 and e44 do not match e20  <10><0>:>
f9: <:<10>illegal devicenumber in e18-e19<10><0>:>

g15: h.  r.(:e19+g18+1:) w.;    process device nr
g16: h.  r.(:e19+g18+1:) w.;    process device buffer length
g19: h.  r.g18*8+1 w.  ;    process names


g12: rl  w3     66     ; init:
     rs. w3     b122.  ;    b122:= boss descr;
     rl  w1  x3+76     ;    b31:=b30:=
     al  w1  x1+1      ;       boss priv base;  (low std+1)
     rs. w1     b31.   ;
     rs. w1     b30.   ;
     dl  w1  x3+74     ;    w0.w1:=boss max base;
     ba. w0     1      ;    w0:= w0 + 1;
     al. w3     f1.    ;
     jd         1<11+72;    set catalog base(w0, w1);

     al. w3     f0.    ;    w3:= <:printer:>;
     jd         1<11+80;    create pseudo process;
     jd         1<11+4 ;
     rs. w0     b124.  ;    b124:= descr addr(w3);

     al. w2     b33.-2 ;    w2:=first of reader device numbers -2
a7:  al  w2  x2+2      ;    w2:=next reader device number
     sl. w2     b35.   ;    if top of table then
     jl.        a8.    ;    all pseudoreaders created
     rl  w3  x2        ;    w3:=reader device number
     ls  w3     1      ;
     wa  w3     74     ;    w3:=process description of readerprocess
     rl  w3  x3        ;
     dl  w1  x3+4      ;    move device name
     ds. w1     f2.+2  ;    from process description to local buffer
     dl  w1  x3+8      ;    
     ds. w1     f2.+6  ;
     al. w3     f2.    ;    w3:=ref device name
     jd         1<11+80;    create pseudoprocess
     jd         1<11+4 ;    get process description
     rs  w0  x2+b123-b33;   set descr.addr in pseudoreader table
     jl.        a7.    ;    continue
a8:
     al. w3     f3.    ;    w3:= <:card reader:>;
     jd         1<11+80;    create pseudo process;
     jd         1<11+4 ;
     rs. w0     b126.  ;    b126:= descr addr(w3);
     al. w3     f4.    ;    w3:= <:terminal:>;
     jd         1<11+80;    create pseudo process;
     jd         1<11+4 ;
     rs. w0     b125.  ;    b125:= descr addr(w3);

     rl. w1     b110.  ;
     rl  w0  x1+19<1   ;    reserve base:= current semafore;
     rs. w0     f7.    ;

     al. w0     f8.    ;
     al  w1     e19+g18;
     se  w1     e21    ;    if e19+g18<>e21 then
     jl. w3    (b274.) ;    init alarm(<:option error:>);


\f



; kll 4.4.72                    boss 2, psjob run init   ...19...


a1:  rl. w3     f5.    ;    for process:= 0 step 1 until e19+g18-1 do
     al  w3  x3+1      ;    begin
     rs. w3     f5.    ;
     sl  w3     e19+g18;
     jl.        a2.    ;

     sh  w3     e19-1  ;    if device then goto a3;
     jl.        a3.    ;

     am        (66)    ;
     dl  w1    +74     ;    w0w1 := boss max base;
     al. w3     f1.    ;
     jd         1<11+72;    set catalog base(w0, w1);
     rl. w3     f5.    ;    w3 := index;

     al  w3  x3-e19    ;    comment ip;
     ls  w3     3      ;
     al. w3  x3+g19.   ;    w3 := ip name(index);
     jd         1<11+4 ;    w0 := process descr(w3);
     rl. w3     f5.    ;    w3 := index;
     se  w0     0      ;    if w0=0 (process unknown) then
     jl.        a5.    ;    begin
     bz. w1  x3+g16.   ;
     rl. w0     f7.    ;      reserve buffer;
     ws  w0     2      ;
     rs. w0     f7.    ;
     jl.        a1.    ;      goto next;
a5:                    ;    end;

     rl  w2     72     ;    w2 := name table(w0);
a0:  sn  w0 (x2)       ;
     jl.        a6.    ;
     al  w2  x2+2      ;
     jl.        a0.    ;

\f


; sm 75.06.03                   boss 2, psjob run init   ...19a...


a6:  am        (66)    ;
     dl  w1    +74     ;    w0w1 := boss max base;
     ba. w0     1      ;    w0 := w0 + 1;
     al. w3     f1.    ;
     jd         1<11+72;    set catalog base(w0, w1);
     rl. w3     f5.    ;    w3 := index;
     al  w1  x2        ;    w1 := name table address;
     jl.        a4.    ;


a3:  bz. w1  x3+g15.   ;      w1:= device nr(process);
     ls  w1     1      ;   
     wa  w1     74     ;      w1:= name table(w1);
     al. w0     f9.    ;
     sl  w1     (76)   ;    if outside monitor table then
     jl. w3     (b274.);      init alarm (<:illegal devicenumber in e18-e19:>);
a4:  wm. w3     f6.    ;
     rs. w1  x3+b128.+8;      set name table in
     rl  w2  x1        ;      name(process) on io;
     dl  w1  x2+4      ;
     ds. w1  x3+b128.+2;      move name(process)
     dl  w1  x2+8      ;      to io;
     ds. w1  x3+b128.+6;  
     am.       (f5.)   ;
     bz. w1     g16.   ;      w1:= buffer length;
     rl. w0     f7.    ;
     ws  w0     2      ;      reserve buffer;
     rs. w0     f7.    ;
     rs. w0  x3+b128.+10;     set buffer start(process) on io;
     al  w1  x1-2      ;      set buffer length(process) -2 on io;
     rs. w1  x3+b128.+12;
     al. w3  x3+b128.  ;      w3:= name(process);
     jd         1<11+6 ;      initialize process;
     jd         1<11+80;      create pseudo process;
     jd         1<11+4 ;
     rl. w1     f5.    ;
     ls  w1     1      ;      set pseudo process
     rs. w0  x1+b127.  ;      address on io;
     jl.        a1.    ;    end;
a2:  bl. w3     b195.  ;    set displacements
     al  w3  x3-8      ;
     hs. w3     b196.  ;
     al  w3  x3+4      ;
     hs. w3     b214.  ;

\f




; kll 25.5.73                  boss 2, psjob run init   ...19b...


     al  w0     i91    ;    psjob aux on disc;
     al  w1     g2     ;    length;
     jl. w3    (b111.) ;    reserve virt;
     rs. w2     b37.   ;    b37:= virt psjob aux;
     rs. w2     b298.  ;
     al. w0     g3.    ;    start;
     jl. w3    (b112.) ;    output virt;

     al  w0     i92    ;    psjob i/o on disc;
     al  w1     g1     ;    length;
     jl. w3    (b111.) ;    reserve virt;
     al. w0     b0.    ;    start;
     jl. w3    (b112.) ;    output virt;
     rs. w2     b297.  ;

     jl. w3    (2)     ;    set externals;
b296:           40     ;

b298:    0  ,   323    ;    virt psjob aux;
b297:    0  ,   320    ;    virt psjob io;
         g0 ,   321    ;    rel entry psjob io;
f7:      0  ,    19    ;    reserve base;
         g9 ,   350    ;    rel answer;
         0  ,   -1000  ;    end of externals;


     jl. w3    (b113.) ;    goto end init;

b.  a3  w.

a1:  am        -2000   ;
     al. w1     e51.+2000;  w1:=first of option-reader-table (bytes-table)
     al. w2     b33.   ;    w2:=first of local reader-table (word-table)
a2:  sl. w2     b33.+e52<1; 
     jl.        a3.    ;
     bz  w0  x1        ;    move
     rs  w0  x2        ;      from option-table
     al  w1  x1+1      ;
     al  w2  x2+2      ;      to local table
     jl.        a2.    ;
a3:  al  w0     0      ;
     al  w2     0      ;
     jl      x3        ;    return to slang
     jl.        a1.    ;
j.
e.


e.                     ;
\f


; kll 4.1.72                    boss 2, psjob aux   ...20...


b. b25, c25 , d2, f70  w.    ;
g3:
b0:       0, r.5       ;    page addresses
     41<12 + 0         ;    page ident:  psjob aux
b1:       e13          ;    semafore length
b2:       32           ;    space
b3:       10           ;    number system base
b4:       32<16        ;  
b5:  <:message :>, <:pause <0>:>;
b6:  2<12 + 0<8 + 0    ;    lookup message:
b7:       0, r.8       ;    work: (used in lookup mess)   
b8=b7+2, b9=b8+2, b10=b9+2
b11:      48<8+32      ;
b12:      <:printer:>,0;
b13:      7            ;    cat key mask
b15:      1<16         ;    attention status
b16:      1<6          ;    job printer accounted
b17:      <:primout:>,0;
b14=k-2                ;    constant zero
b18:      <:disc:>     ;
b19:      <:std:>
b20:      <:conv:>
b21:       0,r.6       ;   local area tp process name
b22:      0            ;   nta of device

b88: h.0,c.e23-1,r.e23,z.;  first exchangeable disc drive
b89:      0, w.        ;    top of disc drive table
b30:      0            ;    boss private interval
b31:      0            ;
b234:     -1-1<4       ;    mask
b150:     379          ;    paper manipulation semafor
b151:     1            ;    send and wait
b152:     25           ;    call
b153:     3            ;    lock
b154:     4            ;    open
b155:     5            ;    lock chained
b156:     6            ;    open chained
b157:     7            ;    get pages
b158:     8            ;    page jump
b159:     26           ;    current descr
b160:     51           ;    request que
b161:     52           ;    request free
b162:     60           ;    job controlled printer empty
b163:     61           ;     -      -        -     full
b164:     63           ;    psjob que
b165:     67           ;    banker que
b166:     74           ;    catalock
b168:     320          ;    psjob i/o point
b169:     321          ;
b291:     378          ;    rb printer queue
b292:     377          ;    rb printer wait
b170:     380          ;    paper que
b171:     381          ;    printer wait
b172:     382          ;    convert operations
b173:     383          ;    job controlled printer
b174:     384          ;    super buffer start, top
;b175 - b199           ;    external displacements
b200:     32           ;    prepare access
b201:     33           ;    terminate access
b202:     288          ;    slice length disc
b216:     400          ;    virt,
b217:     404          ;    rel ref psjobstart entry:offline
b229:     388          ;    ref jobprinter semafor
b230:     320          ;    virt ref io
b231:     g14          ;    rel ref io.c7
b132:     140          ;  virt,
b135:     142          ;    rel. lookup device;
b302:    141           ;    rel lookup and reserve device

d2=       12           ;    double work

\f


; kll 4.1.72                    boss 2, psjobaux   ...21...


;   content:

;   label   page     name

;   c1      22       new job
;   c2      23       print
;   c3      23       hard error
;   c4      29       start job
;   c5      27       convert from job
;   c6      29       banker
;   c7      29       lock answer
;   c8      26       answer
;   c9      26a      name device
;   c10     26       submit
;   c11     34       change paper
;   c12     30       answer ok
;   c13     30       answer not ok
;   c14     30       return to io
;   c15     25       mount kit
;   c17     31       send convert operation
;   c18     32       get convert operation
;   c19     33       send job printer operation
;   c20     33a      lookup rb printername
;   c24     26b      telex link

; definition of f-names
;   relative addresses used on job descr page
;   in convert from job

;
;
f4 =  4    ;+0   ref head and tail  ; rel return in lookup
f6 =  6    ;+2                      ; rel rbprintername in lookup
f8 =  8    ;+4                      ; name of rb parent process in lookup
f10= 10    ;+6       new name       ;+2
f12= 12    ;+8                      ;+4
f14= 14    ;+10                     ;+6
f16= 16    ;+12                     ;+8 name table addr
f18= 18    ;+14  ref tail
;          ;+16  docname
f22= 22    ;+18
;          ;+20
;          ;+22
;          ;+24
;          ;+26
;          ;+28
f34= 34    ;+30  content, entry
f36= 36    ;+32  slices
f38= 38    ;+0   ref old name
f40= 40    ;+2
;          ;+4
f44= 44    ;+6
f46= 46    ;+8
f48= 48    ;     paper type
f50= 50    ;+0  rb printername
f52= 52    ;+2
f54= 54    ;+0  dev.host description
f56= 56    ;+2       -
f58= 58    ;    rb term ident
f60= 60    ;    slices to be unclaimed
f62= 62    ;    device kind
f66= 66    ;    last word of catalog base




\f


; kll 4.1.72                    boss 2, psjob aux ...22...


b. a9, j9  w.          ;    page 1 = job descr page
c1:                    ; new job:
     rl. w2     b0.+8  ;
     rl  w2  x2+4      ;    w2:= message addr;
     dl  w1  x2+14     ;    w0w1:=mess.rbprintername;
     sn  w0     0      ;    if rbprintername = 0 then
     al  w0     1      ;      rbprintername:=1; (local printer)

j0:  al  w2  x3+349    ;    w2:=ref operation;
     al  w2  x2+18     ;    w2:=ref op.rbprintername;
     ds  w1  x2+2      ;    set printername;
b136=k+1
     dl  w1  x3+424    ;    w0w1:=host description
     ds  w1  x2+6      ;    set host description
     se  w0     0      ;    if local then
     jl.        a7.    ;    begin
     dl  w1  x2+2      ;   
     sl  w0     2      ;      if printername = text then
     jl.        a7.    ;      goto printer named;
   
a6:  ld  w1    -100    ; 
     ds  w1  x2+2      ;      printername:=0;
     ds  w1  x2+6      ;    clear host description
     jl.        a4.    ;    end else
   
a7:  dl  w1  x2+2      ;    begin printer named:
     sn. w0    (b19.)  ;      if printername=<:std:>
     se  w1     0      ;
     jl.        4      ;      then
     jl.        a6.    ;      printer:=host ident:=0;
     ds  w1  x3+r1+2   ;      set printername in lookup mess.;
     ld  w1    -100    ;
     ds  w1  x3+r1+6   ;
j6:  rl  w0  x3+523    ;    set abs ref message area
     rs  w0  x3+r0     ;
j7:  dl  w1  x3+529    ;    set catalog base = project base
     ds  w1  x3+r6+2   ;
     dl  w1  x2+6      ;    set dev.host description
     ds  w1  x3+r2+2   ;
     al  w1     14     ; 
     rs  w1  x3+r4     ;     set mode.kind


     rl. w2     b132.  ;
     rl. w3     b135.  ;
     jl. w1    (b152.) ;      call(lookup device);

     jl.        a3.    ;+2    error return;
     rl  w0  x3+r104   ;+4    w0:=rckind;
     sn  w0     14     ;      if kind=printer then
     jl.        a4.    ;      ok else
     am         21-20  ;      device not printer
a1:  al  w0     20     ;    device unknown
     jl.        c13.   ;      goto answer not ok;
a3:
\f


; lkn 76.10.19           boss 2,  psjob aux       ...22a...
b180=k+1
     al  w2  x3+349    ;    w2:=ref operation
     rl  w0  x2+18     ;    w0:=first of printer name
     se  w0     1      ;      if named printer then
     jl.        a1.    ;      unknown
     ld  w1    -100    ;
     ds  w1  x2+20     ;      set printername=0;
a4:                    ;    end;

     al  w0     10     ;
     ls  w0     12     ;
j1:  al  w1  x3+332    ;    w1:= psjob operation;
     rs  w0  x1+2      ;    code:= get psjob;
     rl. w2     b165.  ;
     jl. w3    (b156.) ;    open chained(banker que);
     jl. w1     c7.    ;    lock answer;

j3:  al  w1  x3+349    ;    w1:= psjob operation (d14+4);
j4:  rl  w3  x3+342    ;    w3:= job process addr;
     dl  w0  x3+78     ;
     ds  w0  x1+16     ;    op(+14, +16):= standard interval for job;

     rl. w2     b0.+8  ;
     rl  w2  x2+4      ;    w2:= message addr;
     dl  w0  x2+18     ;
     ds  w0  x1+8      ;    move name in message to
     dl  w0  x2+22     ;    operation + 6, +8, +10, +12.
     ds  w0  x1+12     ;
     al         1      ;

     bl  w2  x1-7      ;
     sn  w2     0      ;    if no psjobidle then
     jl.        c13.   ;    goto answer not ok;

     al  w0     6      ;    code:= internal job;
     rs  w0  x1+2      ;
     rl  w0  x1-6      ;
     rs  w0  x1+4      ;    op + 4:= answer sem;
     al  w2  x2-2      ;
     wm. w2     b1.    ;
     wa. w2     b164.  ;    w2:= psjob que+ (psjob nr-2) * sem length;
     rl. w3     b0.+2  ;    w3:=ref page1
j2:  al  w1  x3+349    ;    w1:=psjob operation;
     jl. w3    (b156.) ;    open chained(w1, w2);

     jl. w1     c7.    ;    lock answer;
j5:  al  w1  x3+349    ;    w1:= ref operation;
     bl  w0  x1+2      ;   
     jl.        c13.   ;    goto answer not ok;

b175 = j1+1, b176 = j2+1, b177 = j3+1, b178 = j4+1, b70 = j5+1
b179 = j0+1, b140=j6+1, b142=j7+1

e.                     ;
\f


; kll 30.11.71                    boss 2, psjob aux   ...23...


b. a20, j9  w.         ;    page 1 = job descr page
c2:                    ; print:   hard error:
c3:  rl. w2     b161.  ;
     jl. w3    (b155.) ;    lock chained(request free);

     rs. w1     b0.+6  ;
     rl. w1    (b159.) ;    w1:= current descr;
     rl  w0  x1+10     ;
     rs  w0  x1+12     ;    page 3:= page 2;

     rl. w2     b0.+8  ;
     rl  w2  x2+4      ;    w2:= message addr;
     rl  w1  x2+8      ;
     so  w1     1      ;    if wait then
     jl.        a1.    ;    begin
j4:  rs  w0  x3+343    ;      saved virt request;
     al  w0     17     ;
     jl. w1     c6.    ;      banker(stop job); lock answer;
     am        1<3-1      ;    end;

a1:  al  w3     3      ;    if wait then code:= insert with bell
     al  w0     14     ;    else code:= print line;
     se  w3     3      ;
     am        +6      ;
     al. w2     b5.    ;
     rl. w1     b0.+6  ;    w1:= operation;
     ds  w0  x1+4      ;    length:= 14;
     dl  w0  x2+2      ;
     ds  w0  x1+8      ;    
     rl  w0  x2+4      ;    move <:message:> or <:pause:>;
     rs  w0  x1+10     ;
     rl. w2     b0.+8  ;

     rl  w2  x2+4      ;    w2:= message addr;
     al  w0    -12     ;
     rs. w0     b8.    ;    bit:= -12;

a2:  rl. w3     b8.    ; next bit:
     al  w3  x3+1      ;    bit:= bit + 1;
     rs. w3     b8.    ;
     sl  w3    -4      ;    if bit > -5 then
     jl.        a3.    ;    goto send request;
     rl  w0  x2+8      ;
     ls  w0  x3        ;    if operation pattern shift bit
     sz  w0     1      ;    extract 1 = 1 then
     jl.        a4.    ;    goto integer
     jl.        a6.    ;    else goto text;
c. 6+24+6*7-e10-1
m. e10 must at least be 72
z.

\f


; kll 30.11.71                    boss 2, psjob aux   ...24...


a3:  rl. w2     b0.+2  ; send request:
j1:  dl  w0  x2+329    ;
     ds  w0  x1+14     ;
j2:  dl  w0  x2+330    ;    move job name and space;
     lo. w0     b2.    ;
     ds  w0  x1+18     ;
     rl. w2     b160.  ;
     jl. w3    (b156.) ;    open chained(request que, w1);
     rl. w2     b0.+8  ;
     rl  w2  x2+4      ;
     rl  w0  x2+8      ;
     sz  w0     1      ;    if wait then
     jl.        c14.   ;    goto return to io else
     jl.        c12.   ;    goto answer ok;


a4:  ls  w3     1      ; integer:
     am      x3        ;
     rl  w0  x2+32     ;
     jl. w1     a8.    ;    ciffer 2;
     lo. w3     b11.   ;
     rs  w3  x1+10     ;
     jl. w1     a7.    ;    ciffer 3;
     lo  w3  x1+10     ;
     rs  w3  x1+10     ;
     jl. w1     a9.    ;    ciffer 1;
     rs  w3  x1+8      ;
     jl. w1     a8.    ;    ciffer 2;
     lo  w3  x1+8      ;
     rs  w3  x1+8      ;
     jl. w1     a7.    ;    ciffer 3;
     lo  w3  x1+8      ;
     rs  w3  x1+8      ;
     jl. w1     a9.    ;    ciffer 1;
     rs  w3  x1+6      ;
     jl. w1     a8.    ;    ciffer 2;
     lo  w3  x1+6      ;
     rs  w3  x1+6      ;
     jl. w1     a7.    ;    ciffer 3;
     lo. w3     b4.    ;
     lo  w3  x1+6      ;
     rs  w3  x1+6      ;    length:= length + 4;
     am         4      ;
a5:  al  w0     2      ; add length:
     rl. w1     b0.+6  ;    length:=length+2;
     wa  w0  x1+4      ;
     rs  w0  x1+4      ;
     jl.        a2.    ;    goto next bit;
\f


; kll 4.1.72                    boss 2, psjob aux   ...25...


a6:  ls  w3     1      ; text:
     am      x3        ;
     rl  w0  x2+32     ;    move textword (bit);
     am     (x1+4)     ;
     rs  w0  x1+6      ;
     jl.        a5.    ;    goto add length;


a7:  am         8      ; ciffer 3:
a8:  am         8      ; ciffer 2:
a9:  al  w3     0      ; ciffer 1:
     rs. w3     b9.    ;
     rs. w1     b10.   ;    save return;
     al  w3     0      ;    w3:= w0 mod 10;
     wd. w0     b3.    ;    w0:= w0/10;
     sh  w0     0      ;    if w0 <> 0 or
     se  w3     0      ;    w3 <> 0 then
     al  w3  x3+48     ;    w3:= w3 + text bits;
     ls. w3    (b9.)   ;    w3:= w3 shift ciffer;
     rl. w1     b0.+6  ;
     wa  w1  x1+4      ;    w1:= operation + length;
     jl.       (b10.)  ;    goto saved return;
b276=j1+1, b277=j2+1, b278=j4+1
e.                     ;
\f


; 6.2.75                            boss 2, psjob aux  ...25a...

b. a10, j5 w.
a9=e17 - (:e22-e24:) - e23 ;  no of device nos in device list following disc drives

c15: rl. w2     b0.+8  ; mount kit:
     rl  w2  x2+4      ;    w2 := message addr;

j0:  al  w3  x3+403    ;    w3 := addr of first privat kit;

a0:  al  w3  x3+14     ; rep: next kit;
     dl  w1  x3-12     ;
     sn  w0     0      ;    if end private kit table then
     jl.        a1.    ;      goto not found;

     sn  w0 (x2+16)    ;    if kitname <> privat kit name then
     se  w1 (x2+18)    ;      goto rep;
     jl.        a0.    ;
     dl  w1  x3-8      ;
     sn  w0 (x2+20)    ;
     se  w1 (x2+22)    ;
     jl.        a0.    ;

     rl  w1  x2+14     ;    w1:=device no;
     sl  w1     0      ;    if device no < 0 
     sl  w1     2047   ;    or device no > byte size 
     jl.        a3.    ;    then error;
     hs. w1     b89.   ;

     al  w2    -e23-1  ;
a10: al  w2  x2+1      ;    search device no in table
     bl. w0  x2+b89.   ;
     se  w0  x1        ;
     jl.        a10.   ;

     sn  w2     0      ;
     jl.        a3.    ;

     al  w0     1      ;
     al  w1     0      ;
     ld  w1  x2-a9+23  ;    w0w1:=device bit to test;

     rl. w3     b0.+2  ;
j1:  al  w3  x3+340    ;    w0w1:=device bit and device word;
     la  w0  x3-2      ;
     la  w1  x3        ;
     lo  w0     2      ;    w0:=w0+w1;
     sn  w0     0      ;    if no bit survived then
     jl.        a2.    ;      goto device not reserved;
     jl.        c2.    ;    goto print;

a3:  am         3-2    ; device unknown:
a2:  am         2-1    ; device not reserved:
a1:  al  w0     1      ; not found:
     jl.        c13.   ;    goto answer not ok;

b288=j0+1, b241 = j1+1
e.
\f


; kll 30.11.71                    boss 2, psjob aux   ...26...


b. a10,j25,w.          ;
c8:  al  w1  x3+332    ; answer:
     al  w0     0      ;    w0:= virt request;
j3:  rx  w0  x3+343    ;    virt request:= 0;
     rs  w0  x1+6      ;    
     se  w0     0      ;    if request line pending then
     jl.        a4.    ;      goto remove request;

j10: dl  w1  x3+376    ;    w1:=actual waiting time
     sn  w1     0      ;    if w1=0 then
     jl.        a1.    ;      goto answer and start job;
     wa  w0     2      ;    add actual waiting time
     al  w1     0      ;    to summa waiting time

j11: ds  w1  x3+376    ;    and clear actual waiting time
     al  w0     30     ;    
     al  w2    -1      ;    banker.set waiting time.infinity
     jl. w1     c6.    ;   
     jl.        a1.    ;    goto answer and start job

a4:  al  w0     1      ;    remove request
     rs  w0  x1+2      ;
     rl. w2     b160.  ;
     jl. w3    (b156.) ;    open chained(request que, remove line);
     jl. w1     c7.    ;    lock answer;

a1:                    ;    answer and start job
j1:  rl  w1  x3+341    ;
     al  w2     0      ;    w2:= message(sender table);
     rx  w2  x1+8      ;    message(sender table):= 0;
     rl. w1     b0.+8  ;
     al  w1  x1+4      ;    w1:= answer addr;
     al  w0     1      ;
     sl  w2     2      ;    if message addr<>0 then
     jd         1<11+22;    send answer;
     jl. w1     c4.    ;    banker(start job); lock answer;
     jl.        a0.    ;    goto skip jobstart;
\f


; sm 75.07.11                   boss 2, psjob aux   ...26a...
c9:  al  w0     1      ;
     jl.        c13.    ;

;  reestablish old page situation:
;    page 1 = job descr page      (unchanged)
;    page 2   free                (unchanged)
;    page 3   free
;    page 4 = operation
;
c16: rl. w1    (b159.) ;    w1:=current coruno description;
     rl  w0  x1+12     ;
     rs  w0  x1+14     ;    page 4:=operation;
     rl. w0     b0.+6  ;
     rs. w0     b0.+8  ;
     al  w0     0      ;
     rs  w0  x1+12     ;    clear page 3;
     rs. w0     b0.+6  ;
     jl      x2        ;    return;

; establish page situation before call of rb-procedures.
; page3:= page4 (operation)
; page4:= page1 (job descr page)

c22: rl. w1    (b159.) ;    w1:= current coroutine
     rl  w0  x1+14     ; 
     rs  w0  x1+12     ;    page3:=page4
     rl  w0  x1+8      ;
     rs  w0  x1+14     ;    page4:=page1
     jl      x2        ;    return


c10: a0:               ; dummy submit: skip jobstart:
     rl. w2     b0.+8  ;
     al  w0     0      ;    opcode:=0;
     hs  w0  x2+2      ;
     jl.        c14.   ;    goto io;

\f


;bbj 77 06 21               psjob aux                       ...26b...

; creation of a t e l e x link.
; the parentmessage (No 50) requests the creation of a link to a telex
; device specified.
; this is performed the following way :
;
;   0) check that link call is not exceeded
;
;   1) lookup (and reserve) device is called with the parameters
;      specified in tprocs.
;
;   2) the child (the job which has sent the parentmessage) is
;      included as a user of the device (telex).
;
;   3) the answer is sent (included is the peripheral process
;      name).
;
; in case of errors, boss returns an answer only containing the 
; error result.

; at entry page1=job desc page
;          page3=var page
;          page4=operation

c24:
j14: bl  w2  x3+527     ;   w2:=number of allowed links
jd-1
     sh  w2     0       ;   if w2 <=  0 then
     jl.        a9.     ;    error return(exceeded link)
 
     rl. w2     b0.+8   ;   w2:=ref operation
     rl  w2  x2+4       ;   w2:= ref message
j12: rl  w0  x3+523     ;   w0:=abs add of dataarea
     rs  w0  x3+r0      ;
     dl  w1  x2+8+4     ;   move name
jd-1
     ds  w1  x3+r1+2    ;   (special for telex)
     dl  w1  x2+8+8     ;
jd-1
     ds  w1  x3+r1+6    ;
     bz  w0  x2+8+11    ;   w0:=hostno
     rl  w1  x2+8+12    ;   w1:=hostid
jd-1 
     sn  w0     0       ;   if w0<> 0 and
     se  w1     0       ;      w1<> 0
     jl.        a7.     ;    then use as specified in mess
j13: dl  w1  x3+424     ;    else use current
a7:  ds  w1  x3+r2+2    ;
jd-1
     al  w0     0       ;
     rs  w0  x3+r5      ;   timeout:=0
     al  w0     36      ;
     rs  w0  x3+r4      ;   mode,kind:= 0<12 +36
j15: dl  w2  x3+421     ;   w1,w2:= job std interval
     ds  w2  x3+r6+2    ;
     jl. w2     c22.    ;   establish page situation before call
     rl. w2     b132.   ;   w2:= virt
     rl. w3     b302.   ;   w3:= rel
     jl. w1    (b152.)  ;   call(lookup (and reserve))
     jl.        a5.     ;+2 error return
     jl. w2     c16.    ;+4 establish old page situation

; the child process must be included as user of the device
; to be permitted to use it.
     rl  w1  x3+r101    ;   w1:=nta of device
     rs. w1     b22.    ;   store nta in local variable
     ws  w1      74     ;   w1:= nta - start of nta (devices)
     ls  w1     -1      ;   w1 := w1 div 2 ( the device number)
j16: rl  w2  x3+342     ;   w3:= proc desc of job
     dl  w0  x2+2+2     ; 
     ds. w0     b21.+2  ;   store  name of process
jd-1
     dl  w0  x2+2+6     ; 
     ds. w0     b21.+6  ;   in local variables
jd-1
     al. w3     b21.    ;   w3:= ref to name of job process
     jd         1<11+12 ;   include user
jd-1
     se  w0     0       ;   if w0 <> 0 then
     jl.        a8.     ;    error return (child not included)
     rl. w2    (b22.)   ;   w2:=proc desc of device
     dl  w1  x2+2+2     ;
     ds. w1     b7.+4   ;   store name of device
jd-1
     dl  w1  x2+2+6     ;
     ds. w1     b7.+8   ;   in answer message
jd-1
     al. w3     b7.+2   ;   w3:= ref to name of device
     jd         1<11+10 ;   release boss as reserver of device
     jl.        c12.    ;   goto normal answer


; error return
a5:  jl. w2     c16.    ;   establish old page situation
     rl  w0  x3+r100    ;   w0:= error value
jd-1
     se  w0     1       ;   if w0 <> 1 then
     jl.        c13.    ;    goto answer not ok
     rl  w1  x3+r100+2  ;   w1:= status bits
jd-1
     ls  w1    16       ;
     lo  w0     2       ;
     jl.        c13.    ;   goto answer not ok
jd-1
     jl.        c13.    ;

a9:  am        10-9     ;   link exceeded (telex not allowed)
a8:  al  w0     9       ;   child cannot be included as user
     jl.        c13.    ;   goto answer not ok



b183=c8+1, b184=j1+1, b199=j3+1
b224=j10+1, b225=j11+1,
b218=j12+1, b219=j13+1, b300=j14+1, b301=j15+1, b303=j16+1

e.                     ;    end a-names,j-names

\f



; kll 4.1.72                    boss 2, psjobaux   ...27...


; convert from job

b. j20, a20  w.        ;
c5:  rl. w2     b0.+8  ;    w2:= ref op;
     rl  w2  x2+4      ;    w2:= ref message;
     dl  w1  x2+8+10   ;    move name;
     ds  w1  x3+f40    ;
     sn. w0    (b17.)  ;
     se. w1    (b17.+2);
     jl.        a6.    ;    if name = primout
     dl  w1  x2+8+14   ;    then 
     sn. w0    (b17.+4);
     se. w1    (b17.+6);
     jl.        a6.    ;    begin
     al  w0     5      ;      w0:= cause:= file in use;
     jl.        c13.   ;      goto answer;
a6:  dl  w1  x2+8+14   ;    end;
     ds  w1  x3+f44    ;
     rl  w0  x2+8+6    ;    move paper type;
     rs  w0  x3+f48    ;
b215=k+1
     rl  w0  x3+423    ;    w0:=host ident;
     se  w0     0      ;    if local terminal then
     jl.        a17.   ;    
     dl  w1  x2+8+4    ;      w0w1:=printername;
     sn. w0    (b20.)  ;      if printer<>conv 
     se. w1    (b20.+2);  
     jl.        a17.   ;    then goto printer named
     jl.        a18.   ;    else goto stdprinter
c.-1 ; before release 15 local jobs could only user local printers
     sn. w0    (b19.)  ;    printer<>std
     se  w1     0      ;
     jl.        a16.   ;    then device unknown
     jl.        a18.   ;      ok;
z.

a17: dl  w1  x2+8+4    ;    w0w1:=printername;
     sn. w0    (b19.)  ;    if printername=<:std:> then
     se  w1     0      ;
     jl.        a7.    ;    
a18: ld  w1    -100    ;
     ds  w1  x3+f52    ;    printername:=0;
     ds  w1  x3+f56    ;    host ident:=0;
     al  w0     14     ;    
     rs  w0  x3+f62    ;    sett kind = printer
     jl.        a13.   ;
a7:  sn. w0    (b20.)  ;    else if printername=<:conv:>
     se. w1    (b20.+2);
     jl.        4      ;    then
     al  w0     1      ;    printername:=1  (= some printer);
     ds  w1  x3+f52    ;    set printername;
     ds  w1  x3+r1+2   ;    set printername in search and lookup message;
     ld  w1    -100    ;
     ds  w1  x3+r1+6   ;
j1:  rl  w0  x3+523    ;    set abs ref message area
     rs  w0  x3+r0     ;
j6:  dl  w1  x3+529    ;    set catalog base = project base
     ds  w1  x3+r6+2   ;
     ds  w1  x3+f66    ;
     al  w0    -1      ;
     rs  w0  x3+r4     ;    mode,kind:=dummy
j14: dl  w1  x3+424    ;    set dev.host description
     ds  w1  x3+r2+2   ;
     ds  w1  x3+f56    ;
     jl. w2     c22.     ;    establish page situation
     dl. w3     b135.  ;
     jl. w1    (b152.) ;    call (lookup device);
 
     jl.        a14.   ;+2  error return;
     jl. w2     c16.   ;+4  reestablish old page situation;
     rl  w0  x3+r104   ;
     rs  w0  x3+f62    ;    set device kind
     sn  w0     14     ;    if device kind <> printer
     jl.        a13.   ;
     sn  w0     12     ;    and device kind <> punch
     jl.        a13.   ;
     jl.        a12.   ;    then goto device kind illegal
a14: jl. w2     c16.   ;    reestablish old page situation;
     rl  w0  x3+f52-2  ;    if default printer then
     sn  w0     1      ;    take std printer
     jl.        a18.   ;    else
a16: am         20-19  ;    device unknown;
a8:  am         19-21  ;    attention status;
a12: al  w0     21     ;    device not printer;
jd-1
     jl.        c13.   ;
 
a13:
j2:  rl  w2  x3+342    ;    w2:= ref proc descr (job);
     dl  w1  x2+78     ;    w0w1:= standard interval.job;
     al  w2  x3+f38    ;    w2:= ref file name;
     jl. w3    (b200.) ;    prepare access;
     am                ;+2  no check;
     al  w1  x3+f4     ;    w1:= ref work;
     al  w3  x3+f38    ;    w3:= ref name;
     jd         1<11+76;    lookup head and tail;
     se  w0     0      ;    if error 
     jl.        a2.    ;      then reject;
\f


; re  31.7.74         boss 2 , psjob aux          ...27a...

     rl. w3     b0.+2  ;    w3:= ref page 1;
     rl  w1  x3+f18    ;    w1:= length
     sh  w1     0      ;    if entry is not an area then
     jl.        a10.   ;      reject;
     bz  w0  x3+f34    ;    if content not text then
     se  w0     0      ;
     jl.        a9.    ;      goto file not text;
     wd. w1     b202.  ;    // slice length
     se  w0     0      ;    round up (nb: new monitor)
     al  w1  x1+1      ;
     rs  w1  x3+f36    ;    slices:= w1;
     al  w0     0      ;
     rs  w0  x3+f60    ;    unclaim 0 slices;
j0:  bl  w0  x3+347    ;
     sh  w0     0      ;
     jl.        a1.    ;    if cbufs<=0 then reject
     rl  w0  x3+f4     ;    w0:= cat key;
     la. w0     b13.   ;
     sn  w0     2      ;    if login then
     jl.        a3.    ;    goto reject;
     sn  w0     3      ;    if permanent then
     jl.        a0.    ;    skip the kidnapping;
     rs  w1  x3+f60    ;    unclaim w1 slices;
     dl  w1  x3+f22    ;    if docname
     sn. w0    (b18.)  ;    <>  <:disc:>
     se. w1    (b18.+2);    
     jl.        a4.    ;    then claims exceeded;
j3:  bl  w0  x3+480    ;    w0:= rest convert slices
     ws  w0  x3+f36    ;    - area length;
j10: bl  w1  x3+479    ;    w1:= convert entries;;
     sl  w0     0      ;    if w0 < 0 
     sh  w1     0      ;    or w1 < 1 then
     jl.        a4.    ;    claims exceeded;


     al  w1  x1-1      ;    save decreased
     ds  w1  x3+f8     ;      convert slices,entries

     al  w3  x3+f10    ;    ref new name
     jd         1<11+68;    generate name;
     al  w1  x3        ;    w1 := new name;
     al  w3  x3+f38-f10;    w3 := old name;
     jd         1<11+46;    rename entry;
     se  w0     0      ;    if result <> ok then
     jl.        a5.    ;      goto file in use;

     rl. w3     b0.+2  ;
     dl  w1  x3+f8     ;    get saved convert slices,entries;
j4:  hs  w0  x3+480    ;    store convert slices;
j5:  hs  w1  x3+479    ;    store convert entries;

     dl. w1     b31.   ;    w0w1 := boss private interval;
     ds  w1  x3+f8     ;    save for >get convert operation<
     al  w3  x3+f10    ;    w3 := new name;
     jd         1<11+74;    set entry interval;
\f


; re  31.7.74           boss 2 , psjob aux             ...28...


     rl. w2     b166.  ;
     jl. w3    (b153.) ;    lock(catalock);

     dl. w1     b31.   ;    w0w1 := boss private interval;
     al. w3     b14.   ;    w3:=ref zeroes;
     jd         1<11+72;    set catbase;

     rl. w3     b0.+2  ;
     al  w1  x3+f18    ;    w1 := ref tail;
j11: rl  w0  x3+346    ;
     rs  w0  x1+10     ;    name table address(tail) := user id;

     rl  w0  x3+f48    ;
     hs  w0  x1+17     ;    entry point := paper type;
     al  w3  x3+f10    ;    w3 := new name;
     jd         1<11+44;    change entry;
     al  w1     2      ;
     jd         1<11+50;    permanent entry(file, key=2);

     rl. w2     b166.  ;
     jl. w3    (b154.) ;    open(catalock);

     rl  w1  x3+f46    ;    move name table address from oldname to newname;
     rs  w1  x3+f18    ;
     am         f10-f38;    (terminate with new name);
a0:  al  w2  x3+f38    ;    end kidnapping;
     jl. w3    (b201.) ;    terminate access;
j7:  bl  w1  x3+347    ; d111
     al  w1  x1-1      ;    rest converts:=
j8:  hs  w1  x3+347    ;    rest converts-1;
     rl  w2  x3+f60    ;
     jl. w1     c18.   ;    get convert op;
     dl  w0  x2+f40    ;
     ds  w0  x1+34     ;    op.file name:= old name;
     dl  w0  x2+f44    ;
     ds  w0  x1+38     ;
     jl. w3     c17.   ;    send convert op;
     jl.        c12.   ;    goto answer ok;

a9:  am         7-6    ; 7:file is no text file
a10: am         6-5    ; 6:file is not an area
a5:  am         1      ; 5:file in use:
a4:  am         1      ; 4:claims exceeded:
a3:  am         1      ; 3:login:
a2:  am         1      ; 2:file does not exist:
a1:  al  w0     1      ; 1:cbufs exceeded:
     rl. w3     b0.+2  ;
     rs  w0  x3+4      ;
     al  w2  x3+f38    ;
     jl. w3    (b201.) ;    terminate access
     rl  w0  x3+4      ;
     jl.        c13.   ;    answer;


b203 = j0+1, b145 = j1+1, b143 = j6+1, b204 = j2+1, b206 = j3+1
b207 = j4+1, b208 = j5+1, b210 = j7+1
b211 = j8+1, b213 = j10+1,b167 = j11+1
b144 = j14+1

e.                     ;    end j-names, a-names

\f



; boj 22.3.72                    boss 2, psjobaux   ...29...


b. j5  w.              ;

c4:
; procedure start job:
;   call: page 1 = jobdescr, w1 = ref return, w3 = ref page 1.

     rl. w2    (b159.) ;
     rl  w2  x2+8      ;
j0:  al  w2  x2+325    ;
     al  w0     16     ;     continue;

c6:
; procedure banker:
;   call: page 1 = jobdescr, w0 = op.code, w1 = ref return,
;         w2 = op.4, w3 = ref page 1.

j1:  hs  w0  x3+348    ;
     ws. w1     b0.    ;
     rs  w1  x3        ;
j2:  rs  w2  x3+349    ;
j3:  al  w1  x3+335    ;
     rl. w2    b165.   ;
     jl. w3    (b156.) ;    opch(banker que, banker op;
     rl  w1  x3        ;
     al. w1  x1+b0.    ;    continue;

c7:
; procedure lock answer:
;   call: page 1 = job descr, w1 = abs ref return.

j4:  rl  w2  x3+334    ;
     al  w3  x1        ;
     jl.       (b153.) ;    lock(answer); return;

b185 = j0+1, b205 = j1+1, b181 = j2+1, b107 = j3+1, b182 = j4+1

e.                     ;
\f


; boj 24.3.72                 boss 2, psjobaux  ...30...
b. j1 w.

c12:
;  answer ok:
;   call: page 1 = job descr page, page 4 = operation.
     al  w0     0      ;    status:= 0;

c13:
;  answer not ok:
; call: page 1 = job descr page, page 4 = operation, w0 = status.

     rs. w0     b7.    ;
     rl. w1     b0.+8  ;    w2:= ref message;
     al  w2     0      ;    ref message:= 0;
     rx  w2  x1+4      ;
     al  w0     1      ;    result:= normal answer;
     al. w1     b7.    ;
     jd         1<11+22;    send answer;
; continue

c14:
;  return to io:
;   page 1 = job descr page.

     rl. w2    (b159.) ;
     am.       (b0.+2) ;
j0:  rl  w0     338    ;
     rs  w0  x2+8      ;    page 1:= job file page;
     ld  w1    -100    ;    page 3:= page 4:= 0;
     ds  w1  x2+14     ;
     dl. w3     b169.  ;
     jl.       (b158.) ;    page jump(io);

b197 = j0+1
e.                     ;

\f



; boj 22.3.72                    boss 2, psjobaux   ...31...


b. a10, j4  w.              ;

c17:
; procedure send convert operation:
;   call: w3 = abs ref return, page 1 = job descr page, 
;         page 2 = convert operation.
;   return: w3 = abs ref page 1, page 1 = job descr page,
;           page 1 rel 4= undefined.

     rl. w1     b0.+4  ;    w1:= ref convert op;
     rl. w2     b0.+2  ;    w2:= ref job descr page;
     ws. w3     b0.    ;
     rs  w3  x2+4      ;    save rel ref return;
j0:  rl  w0  x2+346    ;
     rs  w0  x1+30     ;    op.user id in usercat;
j1:  rl  w0  x2+326    ;
     rs  w0  x1+20     ;    op.project nr;
j2:  dl  w0  x2+0      ;
     ds  w0  x1+24     ;    op.username;
j3:  dl  w0  x2+0      ;
     ds  w0  x1+28     ;
     al  w0     0      ;
     rs  w0  x1+42     ;    op.release,op.segm rel:=0;
     rl. w2     b150.  ;    lock (paper manipulation);
     jl. w3    (b153.) ;
     rl. w1     b0.+4  ;    w1 := convert operation;
     rl  w2  x1+54     ;    if rb convert then
c. i190-1
; if any printername in the convertbuffer then put it into the remote que
     sn  w2     0      ;      begin
     jl.        a4.    ;
     rl. w2     b291.  ;
     jl. w3    (b156.) ;      opench(rb printer queue);
     rl. w2     b292.  ;      
     jl. w3    (b154.) ;      open(rb printer wait);
     jl.        a5.    ;
z.
a4:                    ;      end else begin
     bz  w0  x1+5      ;    ref sem:=
     sl  w0     i78-1  ;    (if paper >= no of papers
     al  w0     i78-1  ;    then extreme special else paper)
     wm. w0     b1.    ;    * sem length
     wa. w0     b170.  ;    + ref printer que;
     rl  w2     0      ;
     jl. w3    (b156.) ;    opch(sem, op);
     rl. w2     b171.  ;
     jl. w3    (b154.) ;    open(printer wait);
a5:                    ;    end;
     rl. w2     b150.  ;    open (paper manipulation);
     jl. w3    (b154.) ;
     rl  w1  x3+4      ;
     jl.     x1+b0.    ;    goto return;

b194 = j0+1, b195 = j1+1, b196 = j2+1, b214 = j3+1
;   nota bene: j2 and j3 are explicitely set in initialization
e.                     ;

\f



; boj 22.3.72                    boss 2, psjobaux   ...32...


c18:
; procedure get convert operation:
;   call: w1 = abs ref return, w2 = length(slices), w3 = abs ref page 1,
;         page 1 = job descr page.
;   return: page 1 = unch, page 2 = convert op, w1 = ref page 2,
;           w2 = ref page 1, w3 = undef.

b.a9,j9 w.

     ws. w1     b0.    ;
     rs  w1  x3+4      ;    save rel ref return;
     al  w0     21     ;
     jl. w1     c6.    ;    banker(unclaim convert);
     rl. w2     b172.  ;
     jl. w3    (b155.) ;    lock(convert free);
     rl  w0  x3+f62    ;
     rs  w0  x1+62     ;    op.device kind
     rl. w2     b0.+2  ;
     dl  w0  x2+f66    ;
     ds  w0  x1+66     ;    op.std catalog base
     dl  w0  x2+f56    ;
     ds  w0  x1+50     ;    op.parent rb;
     dl  w0  x2+f52    ;
     ds  w0  x1+56     ;    op.rbprintername;
     rl  w0  x2+f58    ;
     rs  w0  x1+52     ;    op.rb term ident;
     ld  w0    -100    ;
     ds  w0  x1+46     ;    op.line count,op.page count:=0;
     rs  w0  x1+40     ;    op.segm no:= 0;
     rs  w0  x1+2      ;    op.type:= convert file;
     rl  w0  x2+f36    ;
     hs  w0  x1+4      ;    op.length;
     rl  w0  x2+f48    ;
     hs  w0  x1+5      ;    op.paper;
     dl  w0  x2+f12    ;
     ds  w0  x1+8      ;    op.docname;
     dl  w0  x2+f16    ;
     ds  w0  x1+12     ;
     dl  w0  x2+f8     ;
     ds  w0  x1+18     ;    op.interval;
     am     (x2+4)     ;
     jl.        b0.    ;    goto return;
e.

\f



; boj 22.3.72                    boss 2, psjobaux   ...33...


b. j9, a9  w.          ;

c19:
; procedure send job printer operation:
;   call: page 1 = job descr page, page 3 = job file page, w3 = ref page 1.
;   return: to io.c7, page 1 = job file, page 2 = page 3 = 0,
;           page 4 unch.
     rl. w2     b0.+6  ;    w2:= ref job file page;
     rl. w0     b173.  ;    current share:= first;
j2:  rs  w0  x2+183    ;
     al  w0     512    ;    rest:= 512;
j3:  rs  w0  x2+181    ;
     rl. w1    (b229.) ;    if job printer semafor <= 0
     al  w0     17     ;
     sh  w1     0      ;
     jl. w1     c6.    ;    then stop job;
     rl. w2     b229.  ;
     jl. w3    (b153.) ;    lock(job printer semafor)page2:(op);
     am.       (b0.+6) ;
j4:  bz  w3     474    ;    op.slices:= 0;
     al  w2     2      ;    op.paper:= current job printer paper;
     ds  w3  x1+4      ;    op.type:= jobprinter:= 2;
     rl. w0     b173.  ;    op.start:= superbuffer start;
     rs  w0  x1+40     ;
     rl. w3     b0.+6  ;
j5:  rl  w2  x3+179    ;    w2:=job printer accounted;
     rl. w0     b16.   ;
     lo  w0     4      ;
j6:  rs  w0  x3+179    ;    job printer accounted:=true;
     ld  w0    -100    ;
     so  w2     1<6    ;    if -,w2 then
     ds  w0  x1+46     ;    op.line count,op.page count:=0;
     rl. w2     b0.+2  ;    w2:=job descr page;
     al  w0     14     ;
     rs  w0  x1+62     ;    op.device kind
j7:  dl  w0  x2+425    ;
     ds  w0  x1+56     ;    op.rbprintername;
j8:  rl  w0  x2+418    ; 
     rs  w0  x1+52     ;    op.rb term ident;
     ld  w0    -100    ;   op.dev host descr:=0;
     ds  w0  x1+50     ;       (std printer)
     jl. w3     c17.   ;    send convert op;
     rl. w2     b162.  ;    lock empty;
     jl. w3    (b153.) ;
     jl. w1     c4.    ;    start job;
     rl. w1    (b159.) ;
     rl  w0  x1+12     ;    page 1:= page 3;
     rs  w0  x1+8      ;
     ld  w0    -100    ;
     ds  w0  x1+12     ;    page 2:= page 3:= 0;
     dl. w3     b231.  ;
     jl.       (b158.) ;    page jump(io.c7);
b198 = j2+1, b209 = j3+1
b212 = j4+1, b286 = j5+1, b287 = j6+1
b293 = j7+1, b294 = j8+1
e.                     ;


\f

; boj 22.3.72                    boss 2, psjobaux   ...34...


b. a5, j10  w.          ;
c11:    ; action change paper:
;   call: page 1 = job descr page, page 4 = operation.
     rl. w2     b0.+8  ;    w2:= ref operation;
     rl  w2  x2+4      ;
     dl  w1  x2+8+10   ;
     sn. w0    (b12.)  ;
     se. w1    (b12.+2);
     jl.        c2.    ;
     dl  w1  x2+8+14   ;
     sn. w0    (b12.+4);
     se. w1    (b12.+6);    if op.docname <> <:printer:>
     jl.        c2.    ;    then goto print;
     rl. w1    (b159.) ;
j9:  rl  w0  x3+338    ;
     rs  w0  x1+12     ;    page 3:= job file page;
     jl. w3    (b157.) ;    get pages;
     dl. w2     b0.+8  ;    w2:= ref op; w1:= ref job file;
     rl  w2  x2+4      ;
     rl  w0  x2+8+6    ;    current job printer paper type
j0:  hs  w0  x1+474    ;    := op.paper type;
j1:  rl  w0  x1+179    ;
     so  w0     1<1    ;    test job printer allowed;
     jl.        a0.    ;
     so  w0     1<4    ;    if not job printer used
     jl.        c12.   ;    then goto answer ok;
     la. w0     b234.  ;    -1-1<4.
j2:  rs  w0  x1+179    ;    job printer used:= false;
j3:  rl  w0  x1+181    ;    if rest on share = 0
     se  w0     0      ;
     jl.        a1.    ;      comment change share;
     al  w0     512    ;
j4:  rs  w0  x1+181    ;      rest:= 512;
j5:  wa  w0  x1+183    ;      share:= if share + 512
     sl. w0    (b174.) ;      >= top then start
     rl. w0     b173.  ;      else share + 512;
j6:  rs  w0  x1+183    ;   
     rl. w2     b163.  ;
     jl. w3    (b154.) ;      open(full);
     rl. w2     b162.  ;
     jl. w3    (b153.) ;      lock(empty);
     rl. w1     b0.+6  ;    w1:= ref job file page;
a1:  rl. w2    (b159.) ;    end;
j7:  rl  w0  x1+183    ;
     rs  w0  x2+10     ;    page 2:= share;
     jl. w3    (b157.) ;    get pages;
     dl. w2     b0.+6  ;    w2:=ref jobfile page; w1:= ref share;
     rl. w3    (b159.) ;    w3:=ref own description;
j8:  ws  w1  x2+181    ;
     al  w0    -1      ;    buffer(512 - rest):= -1;
     rs  w0  x1+512    ;
     al  w0     0      ;
     rs  w0  x3+10     ;    page 2:= 0;
     rl. w2     b163.  ;
     jl. w3    (b154.) ;    open(full);
     jl.        c12.   ;    goto answer ok;
b186 = j0+1, b187 = j1+1, b188 = j2+1, b189 = j3+1
b190 = j4+1, b191 = j5+1, b192 = j6+1, b193 = j7+1
b220 = j8+1, b149 = j9+1

a0:  al  w0     2      ; job printer not allowed:
     jl.        c13.   ;    status:= 2; answer;
e.                     ;

\f

; kll 4.1.72                    boss 2, psjob aux   ...35...

;g0                    ;    rel entry psjob io
;g1                    ;    length io
 g2=      k-g3         ;    length aux
;g3                    ;    start aux
 g4=      c1-g3        ;    new job
 g5=      c2-g3        ;    print
 g6=      c3-g3        ;    hard error
 g7=      c19-g3       ;    aux entry send job printer op
 g8=      c5-g3        ;    convert
 g9=      c8-g3        ;    answer
 g10=     c10-g3       ;    submit
 g11=     c11-g3       ;    change paper
 g17=     c15-g3       ;    mount kit
;g12                   ;    init
;g14                   ;    io entry job printer
 g20=     c9-g3        ;    unused
 g21=     c12-g3       ;    answer dummy message
g22=     c24-g3         ;  create telex link

i.e.                   ; end b and c names

\f




; kll 4.4.72                    boss 2, psjob aux   ...36...

b. a15  w.              ;

a0:  b0.               ; j. code:
a4:  g15.              ;
a8:     0            ;
a5:  g16.              ;

a1:  rl  w1  x2        ; start:
     al  w1  x1+a2     ;    reduce segment;
     rs  w1  x2        ;
     rs. w3     a8.    ;    save return to slang;
c. e19+g18-1
     al  w1     e19+g18-1  ;
a3:  am.       (a0.)   ; rep:
     bz. w0  x1+e18-b0+a0.;
     am.       (a4.)   ;    move process eq
     hs. w0  x1+a4.    ;    device numbers
     am.       (a0.)   ;
     bz. w0  x1+e20-b0+a0.; and buffer length
     am.       (a5.)   ;
     hs. w0  x1+a5.    ;
     al  w1  x1-1      ;    to init;
     sl  w1     0      ;
     jl.        a3.    ;

     rl. w3     a0.    ;
     al. w2  x3+g19-b0+a0.; w2 := abs g19;
     al. w3  x3+e44-b0+a0.; w3 := abs e44;

a6:  am.       (a0.)   ; rep6:
     sl. w3     e45-b0+a0.; if w3 = e45 then
     jl.        a11.   ;      goto end;
     dl  w1  x3+2      ;
     ds  w1  x2+2      ;    move name
     dl  w1  x3+6      ;
     ds  w1  x2+6      ;    from options to
     al  w3  x3+8      ;
     al  w2  x2+8      ;    init g19;
     jl.        a6.    ;    goto rep6;
z.
; move device numbers for disc drives into code
a11:
c.e23-1
     rl. w2     a10.   ;

     al  w1    -2000   ;
a9:  bl. w0  x2        ;
     hs. w0  x1+b88.+2000;
     al  w1  x1+1      ;
     al  w2  x2+1      ;
     se  w1     e23-2000;
     jl.        a9.    ;
     jl.        a7.    ;

a10: e22-a9            ;

z.
a7:  al  w0     0      ;
     al  w2     0      ;
     jl.       (a8.)   ;    return to slang;
     jl.        a1.    ;
a2=a0-k                ;    - length of j.code;
j. e.                  ; jump;

i.e.                   ; end b and g names


\f


;boj 11.11.1971                    boss2, psjobfinis   ...37...
h2=h1.


s.       b200          ;    constants and variables in page 0
         f30           ;    initialization names
         c60           ;    routines and labels
w.

;external table
b37.,b40.,b41.,b42.,b43.,b44.,b45.,b46.,b47.,b48.,b49.
b50.,b51.,b52.,b53.,b54.,b55.,b56.,b57.,b58.,b59.
b60.,b61.,b62.,b63.,b64.,b65.,b66.,b67.
b70.,b71.,b72.,b73.,b74.,b75.,b76.,b77.,b78.,b79.
b80.,b81.,b82.,b83.,b84.,b85.,b86.,b87.,b88.,b89.
b90.,b91.,b92.,b93.,b94.,b95.,b96.,b97.,b98.,b99.
b101.,b108.,b109.,b110.,b111.,b112.,b113.,b114.,b115.
b118.,b123.,b125.,b126.,b127.,b128.,b129.
b130.,b131.,b132.,b133.,b134.,b135.,b136.,b137.,b138.,b139.
b140.,b141.,b143.,b144.,b145.,b146.,b147.,b148.,b149.,b150.
b151.,b152.,b154.

f11.,f12.,f13.,f14.,f25.
     0                 ;    end external list
     am.(4),jl.2,c24.  ;    goto initialize
p.2                    ;    input jobdescr
\f


; boj 7.6.72                    boss 2, psjobfinis   ...38...


; routines and entries
;
;    label   page   name
;
;    c0      41a    action time up
;    c1      48     provoke break
;    c2      55     finis
;    c3      43     break and dump
;    c4      47a    corelock request
;    c5      58     return from mounter
;    c6      43     save registers and break and dump
;    c7      41     terminate
;    c8      51     write integer
;    c9      42     break request 
;    c10     42     timer request
;    c11     47a    coreopen request
;    c12     41     user kill
;    c13     55     finis request
;    c14     46a    replace request
;    c15     41     input exhausted
;    c16     41     hard error prim. input
;    c17     55     end medium prim. output
;    c18     41     mount error
;    c19     41     max waiting time exceeded
;    c20     53     clean catalog
;    c21     42     receipt
;    c22     52     release request line
;    c23     54     output page 3
;    c24     68     initialize
;    c25     41     corelock exceeded
;    c26     41     corelock not allowed
;    c27     46     pagejump c2
;    c28     46     bad fp
;    c29     46     process too small for fp
;    c30     46a    min time
;    c31     41     get timer
;    c32     47     warning time exceeded
;    c33     48     no interrupt routine
;    c34     41     time exceeded
;    c35     46     procedure banker
;    c36     47a    low priority start
;    c37     47b    runtime exceeded
;    c38     47b    high priority start page call
;    c39     42     receipt w2
;    c40     47b    high priority start
;    c41     52     digit 1
;    c42     52     digit 2
;    c43     52     digit 3
;    c44     59     release
;    c45     55     set finis cause
;    c46     41a    swop out and wait
;    c47     42     return to psjob io
;    c48     42     answer and return
\f


; boj 11.11.1971                    boss 2, psjobfinis   ...39...


;start of break page

b0:       0            ;    page0 code and constants
          0            ;    page1 job description page
          0            ;    page2
          0            ;    page3 buffers
          0            ;    page4 operation or jobdescr
     42<12 + 0         ; page ident:  psjob break
; constants
b1:  2                 ; 
b3:  -512              ;    constant
b5:  <:image:>         ;
b4:  0,0,0
b6:  5<12              ;    output code
b7:  3<12              ;    input code
b13: <:fp:>,0,r.4      ;
     i7<9/625          ; b15-4: i7 in seconds
     i7                ; b15-2:increment runtime left
b15: i8                ;
b16: <:time exceeded:> ;
     3                 ; b21-2:code=printline
b21: 18                ;    length
b31: <:   :>           ;
b38: 0                 ;    virt,
b39: 0                 ;    rel ref c2
b11: 0                 ;    work
b12: 0                 ;    do
b68: 0                 ;    do
b120:10000             ;
b142:     1<10         ;    d88 replace bit
b153:     1<1         ;    d88 change username after replace bit
b155: -1-1<10-1<1      ;    d88 clear both replace bits
\f


; boj 11.11.1971                    boss 2, psjobfinis   ...40...


; externals

b40:      3            ;    lock
b41:      4            ;    open
b42:      32           ;    prepare access
b43:      33           ;    terminate access
b44:      1            ;    send wait
b45:      25           ;    call
b46:      26           ;    ref ref current corutine
b51:      415          ;    virt,
b47:      413          ;    rel ref prepare bs adjust
b48:      415          ;    virt,
b50:      414          ;    rel ref terminate bs adjust
b49:      30           ;    stop and wait
b52:      473          ;    virt,
b53:      401          ;    rel ref include user
b54:      67           ;    bankerque
b55:      6            ;    open chained
b57:      320          ;    virt,
b58:      321          ;    rel ref psjob io
b61:      51           ;    request que
b62:      52           ;    request free
b63:      5            ;    lock chained
b64:      8            ;    page jump
b146:     21           ;    privout
b108:     282          ;    addr of bankers time relative
\f

; boj 27.12.72               boss 2, psjobfinis ...41...
; terminate entries:
c19: am         19-25  ; 19: max waiting time exceeded
c25: am         1      ; 25:corelock exceeded
c26: am         24-6   ; 24:corelock not allowed
c7:  am         1      ; 6: operator termination
c16: am         1      ; 5: harderror prim input
c15: am         2      ; 4: input exhausted
c34: am         1      ; 2: time exceeded
c12: al  w0     1      ; 1: user termination
     hs  w0  x3+d104   ;    finiscause:=w0
c18:                   ; d104:mounterror:
     jl. w2     c31.   ;    time to finis
     al  w0  x1-i5     ;    :=net run left-i5
     sh  w0     0      ;    provided not negative;
     al  w0     0      ;
     rs  w0  x3+d115   ;
     al  w1    -1      ;
     al  w0    -1      ;    time at provoke before finis
     rs  w0  x3+d115+2 ;     :=infinity
     ds  w1  x3+d115+6 ;    any time := infinity;
     ds  w1  x3+d115+10;
     jl.        c1.    ;    goto provoke

c31:
; procedure gettimer
; call:  w2=ref return
;        w3=ref page1
; return:w1=net run left
;        w02=und
;        w3=unch
     ws. w2     b0.
     rs  w2  x3+d14+30 ;    save ref return
     al  w2    -100    ;
     al  w0     15     ;
     jl. w1     c35.   ;    banker.settimer.longtime
     rl  w0  x3+d14+4  ;
     ad  w1    -11     ;    w0:=netrunleft(0.8 sec)
     wd. w1     b120.  ;    w1:=netrunleft(sec)
     rl  w2  x3+d14+30 ;
     jl.     x2+b0.    ;    return

\f


; sm 75.06.03                   boss 2, psjobfinis  ...41a...

c46:                   ; swop out and wait:
     rl. w1    (b46.)  ;
     rl  w0  x1+10     ;    page 3:=op;
     rs  w0  x1+12     ;
     jl. w2     c49.   ;    set low priority;
     rl. w2     b0.+6  ;
     rl  w2  x2+4      ;    w2:=op.mess.
     rl  w1  x2+8+6    ;    w1:=mess. waiting time
jd-1
     sh  w1 (x3+d138)  ;    if w1 > max
     sh  w1     0      ;      or w1 < 0
     jl.        c19.   ;      then goto max waiting time exceeded
     rs  w1  x3+d137   ;
     al  w0     17     ;
jd-1
     jl. w1     c35.   ;    banker.stop job
     al  w0     30     ;
     rl  w2  x3+d137   ;
jd -1
     jl. w1     c35.   ;    banker.set waiting time
     jl.        c47.   ;    return to psjob io

c0:
; action timeup
; page1=jobdesc page
; w3=ref page1
b.a3w.
     jl. w2     c30.   ;    w1:=ref mintime
     wm. w0     b120.  ;    convert net run left at next event
     ad  w0    -13     ;      from seconds to 0.8 seconds;
     rl. w3     b0.+2  ;
     sl  w0 (x3+d107+14);
     jl.        a2.    ;    if net run left>net run left(event) then
     rl  w1  x3+d137   ;    w1:=actual waiting time wanted
     sh  w1     0      ;    if w1=0 then
     jl.        c21.   ;      goto receipt 
     wa  w1  x3+d136   ;    add actual waiting time to
     rs  w1  x3+d136   ;    summa waiting times
     jl. w1     c40.   ;    high priority start
     jl.        c21.   ;    goto receipt
a2:  al  w0    -1      ;
     rs  w0  x1        ;    tabel(x1):=infinity
     al  w1  x1-d115   ;
     ws  w1     6      ;
     ls  w1    -1      ;
     bl. w1  x1+a3.    ;
     jl.     x1+b0.    ;    goto a3.x1

h.                     ;    tabel of actions
a3:  f26               ; 0: finis
     f18               ; 1: runtime exceeded
     f10               ; 2: save and dump
     f15               ; 3: provoke before dump
     f17               ; 4: high priority time exceeded
     c25-b0            ; 5: provoke corelock exceeded
w.
e.
\f

; boj 18.4.72             boss 2, psjobfinis ...42...
c10:
; timer request:
     jl. w2     c31.   ;    w1:=gettimer
     rl. w2     b0.+8  ;
     rl  w2  x2+4      ;
     ws  w1  x2+20     ;
     rs  w1  x3+d115+6 ;    time at provoke:=
                       ;    t1-net run left
     ws  w1  x2+22     ;    time at save and dump:=
     rs  w1  x3+d115+4 ;    t1 + t2-net run left
;    jl.        c21.   ;    goto receipt


c21:
; receipt:
; page 1=jobdesc, page4=operation
     rl. w2     b0.+8  ;
c39: al  w0     0      ; receipt w2: w2=operation;
     hs  w0  x2+2      ;    op.byte 2:=0
     jl. w2     c30.   ;
     rl  w2     0      ;
     al  w0     15     ;
     jl. w1     c35.   ;    banker.settimer.mintime
c48:                   ; answer and return
     rl  w1  x3+d108   ;    w1:=ref sendertabel entry
     al  w2     0      ;
     rx  w2  x1+8      ;    ref messagebuffer:=0
     al  w0     1      ;
     al  w1  x3+d14+10 ;
     sl  w2     2      ;    if no one else did it
     jd    1<11+22     ;    then send answer
c47:                   ; return to psjobio
     rl. w1    (b46.)  ;    w1:=own descr.
     rl  w0  x3+d0     ;
     rs  w0  x1+8      ;    page1:=jobfile page
     ld  w0    -100    ;
     ds  w0  x1+14     ;    page3:=page4:=0
     dl. w3     b58.   ;
     jl.       (b64.)  ;    pagejump.psjobio

c9:
; break request:
     jl. w2     c30.   ;    if next event
     sn  w1  x3+d115   ;    = finis
     jl.        c27.   ;    then goto finis
     al  w0    -1      ;    time to provoke before dump
     rs  w0  x3+d115+6 ;    := time to dump
     rs  w0  x3+d115+4 ;    := infinity
;    jl.        c3.    ;    goto dump

\f

; boj 15.11.1971                    boss 2, psjobfinis   ...43...


; break and dump  
; save registers and break and dump
; call:   w3=ref jobdescription page
b. a8 w.
c3:  am        -1      ;    save regs := false
c6:  al  w1     1      ;    or true
     rs  w1  x3+d14+22 ;    save saveregs
     rl  w2  x3+d110   ;   
     jl. w3    (b40.)  ;    lock job in core
     al  w2  x3+d19    ;    w2:=ref jobname
     jl. w3    (b49.)  ;    stop and wait
     rl  w2  x3+d106   ;    w2:=proc desc(job)
     dl  w1  x2+78     ;    w0w1:=standardbase(job)
     al. w2     b5.    ;    w2:= ref <:image:>
     jl. w3    (b42.)  ;    prepare access
     jl.        a6.    ;    if error then skip dumpimg
     al  w1  x3+4      ;    w1:=ref work
     al. w3     b5.    ;    w3:=ref<:image:>
     jd      1<11+76   ;    lookup headandtail
     al  w0     7      ;    
     al  w1  x1+14     ;
     hs  w0  x1+16     ;    content:=dumped core area
     jd      1<11+44   ;    change entry
     rl  w0  x3+8      ;    
     rs  w0  x1        ;    save ref nametable entry
     jd         1<11+8 ;    reserve area proc
     rl. w3     b0.+2  ;    w3:=ref page 1
     rl. w0     b6.    ;    
     rs  w0  x3+d14+10 ;    message.0:=5<12;comment output
     dl  w2  x3+d47    ;
     al  w2  x2+508    ;
     ds  w2  x3+d14+14 ;    message.2:4:=first last
     al  w0     0      ;
     rs  w0  x3+d14+16 ;    segmno:=0
     rl  w0  x3+d14+22 ;
     sn  w0     0      ;    if saveregs
     jl.        a5.    ;    then begin
     rl  w2  x3+d106   ;      w2:=procdescr
     rs  w1  x1        ;      abs ref jobarea
     rl  w1  x2+36     ;    if no interruot address then
     sn  w1     0      ;
     jl.        a5.    ;    skip dumping registers;
     al  w1  x1+e56    ;    w1:=ia.top reg.dump area;
     al  w2  x2+e56    ;    w2:=proc.top reg.dump area;
a8:  al  w1  x1-2      ; rep: move registers from proc
     al  w2  x2-2      ;
     rl  w0  x2+e57    ;    to ia;
     rs  w0  x1        ;
     se  w2 (x3+d106)  ;    if w2>proc.first register dump area
     jl.        a8.    ;    then goto rep;
     al  w0     8      ;    break cause:=parent break;
     rs  w0  x1+12     ;
a5:  al  w1  x3+d14+10 ;    end; w1:= ref message
     al. w2     b5.    ;    w2:=ref<:image:>
     jl. w3    (b44.)  ;    send and wait(w1,w2)
     al  w2  x3+10
     jl. w3    (b43.)  ;    terminate access(w2)
a6:
     rl. w1    (b46.)  ;    page 4:= page 1(= job descr);
     rl  w0  x1+8      ;
     rx  w0  x1+14     ;
     rs  w0  x1+12     ;    page 3:= operation;
     dl. w3     b47.   ;    prepare bsadjust;
     jl. w1    (b45.)  ;
     al. w2     a7.    ;    w2:=ref working space
     rl  w3     92     ;    ref(( ref slicelist) table)
\f



; boj 27.12.71                    boss 2, psjobfinis   ...44...


a1:  rl  w1  x3        ; rep1:   w1:=ref slicelist
     sn  w1     0      ;
     jl.        a0.    ;    if w1=0 then exit
     rs. w3     b11.   ;    save ref bstable
     rl  w0  x1-36     ;    w0:=rel ref claims
     am.       (b0.+2) ;
     wa  w0     d106   ;    + proc desc(job)
     rs. w0     b12.   ;    save w0
     dl  w0  x1-16     ;    save docname
     ds  w0  x2+2      ;      in working space
     dl  w0  x1-12     ;
     ds  w0  x2+6      ;
     al  w3     8      ;
     wa. w3     b12.   ;    for w3:= abs ref claims+6 step -2 until abs ref claims
a2:  al  w3  x3-2      ;    do begin
     bz  w0  x3        ;      saved entries:=monitor entries
     rs  w0  x2+20     ;
     bz  w0  x3+1      ;      saved segments:=monitor slices
     rs. w3     b68.   ;
     wm  w0  x1-8      ;               *slicelength
     rl. w3     b68.   ;
     rs  w0  x2+22     ;
     al  w2  x2-4      ;
     se. w3    (b12.)  ;
     jl.        a2.    ;    end
     al  w3     2      ;
     wa. w3     b11.   ;    w3:=next bstable entry
     al  w2  x2+40     ;    w2:=ref more space
     jl.        a1.    ;    goto rep1
a0:  al. w3     b4.    ;    w3:=ref(0)
     am        (66)    ;
     dl  w1     78     ;    w0w1:=boss standard
     jd    1<11+72     ;    set cat base(boss,standard)
     rl. w3     b0.+2  ;    update cputime used
     rl  w1  x3+d106   ;
     dl  w1  x1+56     ;
     ad  w1     11     ;
     wa  w0  x3+d79    ;
     rs  w0  x3+d79    ;
     am        (66)    ;    w1w2 := boss cpu time
     dl  w2    +56     ;
     al  w3  x3+d19    ;    w3:=ref jobname
     jd         1<11+64;    remove process

\f


; sm 75.06.03                   boss 2, psjobfinis   ...45...

     am        (66)    ;    w1w2 := old boss cpu - new boss cpu;
     ss  w2    +56     ;
     ad  w2    -13     ;
     wa. w2    (b108.) ;    update bankers time relative;
     rs. w2    (b108.) ;
     al  w1  x3-d19+d53;    w1:=ref proc parameters
     jd         1<11+56;    create process
     jd         1<11+4 ;    process description
     rs  w0  x3-d19+d106;   save proc descr in page 1
     rs  w0 (x3-d19+d108);  and in sendertable
     al. w2     a7.    ;    w2:=ref saved docname
     rl  w0     92     ;    w0:=ref ref slicelist table
a4:  sn  w0    (96)    ;rep2:   if w0=top(ref slicelist table)
     jl.        a3.    ;    then exit
     al  w1  x2+8      ;    w1:=ref saved claimlist
     rs. w0     b11.   ;
     jd         1<11+78;    set bsclaims(w1,w2,w3)
     rl. w0     b11.   ;
     al  w2  x2+24     ;    w2:=ref next docname
     wa. w0     b1.    ;    w0:=w0+2
     jl.        a4.    ;    goto rep2
a3:
     dl. w3     b50.   ;    terminate bsadjust;
                       ; notice:   only in case that the kits
     jl. w1    (b45.)  ;    has been disconnected, the restclaims
c.-1, o45, z.          ;    (bossfault xref)
     jd        -45     ;    are changed;
     al. w2     b13.   ;
     am        (66)    ;
     dl  w1     78     ;
     jl. w3    (b42.)  ;    prepare access(<:fp:>)
c.-1, o41, z.          ;    (bossfault xref)
     jd        -41     ;    alarm
     al  w1  x3+18     ;    w1:=ref working space
     al. w3     b13.   ;    w3:=ref<:fp:>
     jd         1<11+42;    lookup entry(w1,w3)
     rl. w3     b0.+2  ;    w3:=ref page 1
     rl. w1     b13.+8 ;    save name table addr;
     rs  w1  x3+18     ;
     bz  w1  x3+34     ;
     sn  w0     0      ;    if result <> 0 or
     se  w1     3      ;       content <> 3 then
     jl.        c28.   ;       goto alarm(bad fp);

\f


; sm 75.06.03                   boss 2, psjobfinis   ...45a...

     bz  w0  x3+35     ;
     wa  w0  x3+d53    ;    job ic:= entry+first of jobarea
     rs  w0  x3+48     ;
     al  w0     0      ;
     rs  w0  x3+46     ;
     rl  w0     66     ;    job w0:=
     rs  w0  x3+38     ;    job w1:=
     rs  w0  x3+40     ;    job w2:=
     rs  w0  x3+42     ;    boss proc descr.
     rl  w0  x3+d106   ;
     rs  w0  x3+44     ;     job w3:=job proc descr
     dl  w1  x3+d24+4  ;
     al  w3  x3+d19    ;    w3:=ref job name;
     jd         1<11+72;    set base(job,user base);
     al  w1  x3-d19+38 ;    w1:=ref job registers
     jd         1<11+62;    modify process
     rl. w0     b7.    ;    w0:=3<12;comment input
     rs  w0  x3-d19+d14+10; message.0:=0
     rl  w1  x3+d53-d19;   
     rs  w1  x3-d19+d14+12; message.2:=first of jobarea
     wa  w1  x3-d19+36 ;    w1:=w1+length of program
     sh  w1 (x3-d19+48);    if entry outside program
     jl.        c28.   ;    then finis(bad fp)
     al  w1  x1+511    ;
     la. w1     b3.    ;    last:=512*entier((w1+511)//512)
     al  w1  x1-2      ;          -2;
     sl  w1 (x3-d19+d47);   if last>=top of jobcore then
     jl.        c29.   ;       alarm(fp too big)
     rs  w1  x3-d19+d14+14; message.4:=last
     rl  w0  x3-d19+32 ;    
     rs  w0  x3-d19+d14+16; message.6:=block no
     al  w1  x3-d19+d14+10;  w0:=ref message
     al. w2     b13.   ;    w2:=ref<:fp:>
     jl. w3    (b44.)  ;    send and wait
     se  w0     1<1    ;    if status <> ok then
     jl.        c28.   ;     alarm(bad fp)
     rl  w0  x3+18     ;    restore name table addr;
     rs. w0     b13.+8 ;
     al. w2     b13.   ;
     jl. w3    (b43.)  ;    terminate access
     dl. w3     b53.   ;
     jl. w1    (b45.)  ;    include user(page4=jobdescr)
     al  w3  x3+d19    ;    w3:=ref jobname
     jd         1<11+58;    start process
     rl  w2  x3+d110-d19;
     jl. w3    (b41.)  ;    open(job in core)
     rl. w2     b0.+6  ;    w2:=abs ref saved operation;
     jl.        c39.   ;    goto receipt w2;
a7:  0, r.12*i29       ;    working space for names and claims
e.                     ;    end a-names
\f

; boj 19.1.72                     boss2 , psjobfinis   ...46...
c28: am        -1      ; bad fp:finiscause:=20
c29: al  w0    21      ; fp too big:------:=21
     rl. w3     b0.+2  ;    w3:=ref page1
     hs  w0  x3+d104   ;    finiscause:=w0
     rl  w0  x3+18     ;    restore name table addr;
     rs. w0     b13.+8 ;
     al. w2     b13.   ;    w2:=ref <:fp:>
     jl. w3    (b43.)  ;    terminate access
c27: dl. w3     b39.   ;
     jl.       (b64.)  ;    pagejump(finis(finiscause))
c35:
; procedure banker
; call:   w0=op.code
;         w1=ref return
;         w2=op.4
;         w3=ref page 1=ref jobdescr.
     ws. w1     b0.    ;
     rs  w1  x3+d14+32 ;    save return
     hs  w0  x3+d14+2  ;
     rs  w2  x3+d14+4  ;
     al  w1  x3+d14    ;
     rl. w2     b54.   ;
     jl. w3    (b55.)  ;    opch.bankerque
     rl  w2  x3+d82    ;
     jl. w3    (b40.)  ;    lock.answer
     rl  w1  x3+d14+32 ;
     jl.     x1+b0.    ;    return
\f


; re 75.06.19              boss 2, psjob finis   ...46a...

c30:
; procedure mintime
; call:   w2=ref return
;         w3=ref page1
; return: w0=net run left at next event
;         w1=abs ref next event
;         w2=und
;         w3=unch 
b. a2 w.
     rs  w2  x3+d14+30 ;    save return
     al  w1  x3+d115   ; 
     al  w0     12<6+12;
     jl. w3    (b146.) ;    privout;
     al  w2  x3+d115   ;    challenger:=first player
a1:  al  w1  x2        ;    champion:=challenger
     rl  w0  x1        ;
a2:  sn  w2  x3+d115+10;    if no more players
     jl     (x3+d14+30);    then end game
     al  w2  x2+2      ;    challenger:=next player
     sh  w0 (x2)       ;    if challenger better than champion
     jl.        a1.    ;    then a1
     jl.        a2.    ;    else a2
;nb: d115 contains net run left values
;a late time corresponds to a small number.

c14: rl. w2     b0.+8  ; replace:
     rl  w2  x2+4      ;    w2:= ref message;
     dl  w1  x2+18     ;
     ds  w1  x3+d100+2 ;    move jobfile name in message
     dl  w1  x2+22     ;    to job file name on descr page;
     ds  w1  x3+d100+6 ;
     dl  w1  x3+d24    ;    move standard interval to
     ds  w1  x3+d101+2 ;    job file interval;
     bl  w0  x3+d88    ;
     sz  w0     1<3    ;    if not online then
     jl.        a0.    ;    begin
     lo. w0     b142.  ;
     rl  w1  x2+14     ;      if change of username wanted then
     se  w1     0      ;
     lo. w0     b153.  ;        set change bit;
     sn  w1    -1      ;      if regret then
     la. w1     b155.  ;        clear both replace bits;
     hs  w0  x3+d88    ;      replacebit:=true
     am        -1      ;      answer:= ok;
a0:  al  w0     1      ;    end else answer:= not ok;
     rs  w0  x3+d14+10 ;
     jl.        c21.   ;    goto receipt
e.                     ;
\f

; boj 18.4.72             boss 2, psjobfinis ...47...

c32:
; warning time exceeded:
b. a2 w.
     dl. w1     b15.   ;    w01:=i7 i8
     rs  w1  x3+d14+6  ;    op.6:=i8
     rl  w2     0      ;    w2:=i7
     al  w0     22     ;
     jl. w1     c35.   ;    banker.update runtime left
     al  w2  x3+d115   ;    for i:=0 step 2 until 10
a0:  rl  w1  x2        ;    do d115.i:=d115.i+i7*0.8
     se  w1    -1      ;    provided not infinite;
     wa. w1     b15.-4 ;
     rs  w1  x2        ;
     al  w2  x2+2      ;
     se  w2  x3+d115+12;
     jl.        a0.    ;
     rl  w1  x3+d2     ;
     wa. w1     b15.-2 ;    total net time:= total net time + i7;
     rs  w1  x3+d2     ;
     al  w0     i5     ;    n r l at runtime
     rs  w0  x3+d115+2 ;    exceeded:= i5;
     rl. w2     b62.   ;
     jl. w3    (b63.)  ;    lock.requestfree
     al  w2  x3        ;
     dl  w0  x2+d19+2  ;    op.6:=jobname
     lo. w0     b31.   ;
     lo. w3     b31.   ;
     ds  w0  x1    +8  ;
     dl  w0  x2+d19+6  ;
     lo. w0     b31.   ;
     lo. w3     b31.   ;
     ds  w0  x1    +12 ;
     dl. w0     b16.+2 ;    op.14:=<:time exceeded:>
     ds  w0  x1    +16 ;
     dl. w0     b16.+6 ;  
     ds  w0  x1    +20 ;
     rl. w0     b16.+8 ;
     rs  w0  x1    +22 ;
     dl. w0     b21.   ;    op.2:=printline code
     ds  w0  x1    +4  ;    op.4:=length
     rl. w2     b61.   ;
     jl. w3    (b55.)  ;    opch.requestque
     jl.        c21.   ;    goto receipt
e.
\f


; boj 27.12.72             boss 2, psjobfinis ...47a...
c4:
; corelock request
; page4=operation
b. a2 w.
     rl. w2     b0.+8  ;
     rl  w2  x2+4      ;    if t1=0 then
     rl  w2  x2+20     ;
     sn  w2     0      ;
     jl.        c48.   ;      goto answer and return
     jl. w2     c31.   ;    w1:=gettimer
     rl. w2     b0.+8  ;
     rl  w2  x2+4      ;
     rl  w0  x2+20     ;    if t1>max corelock or
     sh  w0 (x3+d77)   ;    t1<=0 then
     sh  w0     0      ;      goto corelock not allowed
     jl.        c26.   ;   
     ws  w1     0      ;    w1:= net run left - t1;
     rs  w1  x3+d115+10;    time to provoke:=w1
a0:  al  w0     25     ; rep:
     jl. w1     c35.   ;    banker.corelock
     bl  w0  x3+d14+2  ;
     sl  w0     0      ;    if not ok
     jl.        c21.   ;    then begin
     rl  w2  x3+d110   ;
     jl. w3    (b40.)  ;      lock.jobincore
     rl  w2  x3+d110   ;
     jl. w3    (b41.)  ;      open.jobincore 
     jl.        a0.    ;      goto rep
                       ;    end
e.
c11:
; coreopen request:
     al  w0     26     ;
     jl. w1     c35.   ;    banker.coreopen
     al  w0    -1      ;
     rs  w0  x3+d115+10;    time at corelock exceeded:=inf.
     jl.        c21.   ;    goto receipt
c36:                   ; high priority time exceeded:
     jl. w2     c49.   ;    set low priority and start;
     jl.        c21.   ;    goto receipt;

c49: ws. w2     b0.    ; set low priority and start:
     rs  w2  x3+d137   ;    save rel return;
     jl. w2     c31.   ;    gettimer
     bz  w0  x3+d132   ;    op.8:=net run left
     ds  w1  x3+d14+8  ;    op.6:=priority
     rl  w0  x3+d17+2  ;    op.10:=arrival time
     rs  w0  x3+d14+10 ;
     rl. w1    (b46.)  ;    w2:=virt ref swoparea descr
     rl  w1  x1+8      ;
     al  w2  x1+d107   ;
     al  w0     28     ;    w0:=priority start
     jl. w1     c35.   ;    banker
     am      (x3+d137)  ;
     jl.        b0.    ;

\f


; sm 75.06.03                   boss 2, psjobfinis ...47b...


c37:
; runtime exceeded:
     dl  w1     110    ;    if gross runtime used
     ld  w1    -13     ;    >limit
     ss  w1  x3+d17+2  ;    then warning
     sl  w1     i6     ;    else terminate
     jl.        c32.   ;
     jl.        c34.   ;
; procedure high priority start
; the first 42 bytes on job descr page are used for
; working variables for conversational io.
b.a2 w.
c40: ws. w1     b0.    ;
     rs  w1  x3+d137   ;    save rel return
     jl. w2     c31.   ;    get timer
     ws. w1     a1.    ;    net run left at high priority exceeded
     rs  w1  x3+d115+8 ;    :=net run left now  -  i9
     dl  w1     110    ;
     ad  w1     11     ;    arrival time := now
     rs  w0  x3+d14+10 ;
     bz  w0  x3+d132   ;    op.6:= priority;
     rl. w1     a1.    ;
     ds  w1  x3+d14+8  ;    op.8:=time to high priority exceeded
     rl. w1    (b46.)  ;    w2:=virt ref swoparea descr
     rl  w1  x1+8      ;
     al  w2  x1+d107   ;
     al  w0     28     ;    w0:=priority and start
     jl. w1     c35.   ;    banker
     jl. w2     c30.   ;    mintime
     rl  w2     0      ;
     al  w0     15     ;    w0:=set timer
     jl. w1     c35.   ;    banker
     al  w1     0      ;    actual waiting time:=0;
     rx  w1  x3+d137   ;    w1:=rel return
     wa. w1     b0.    ;    w1:=abs return
     jl      x1        ;    return

c38: jl. w1     c40.   ;    call high priority start;
     rl. w1    (b46.)  ;
     rl  w0  x3+d0     ;    page 1:= job file page;
     rs  w0  x1+8      ;
     dl  w3  x3+2      ;
     jl.       (b64.)  ;    return
a1:  i9                ;    time to high priority exceeded
e.
\f

; boj 27.12.72             boss 2, psjobfinis ...48...


; provoke break
; comment stops the job and starts it again in the interrupt routine
; w3=ref page 1

b.  a10  w.
c1:  rl  w1  x3+d106   ;    w1:=ref job proc descr
     rl  w1  x1+36     ;    w1:=ref interrupt routine
     sn  w1     0      ;    if no interrupt routine
     jl.        c33.   ;    then finis(no interrupt)
     al  w1  x3+d14    ;    w1:=ref bankerop
     al  w0     16     ;
     hs  w0  x1+2      ;    op.code:=start job
     rl. w2    (b46.)  ;    w2:=current coroutine
     rl  w2  x2+8      ;    w2:=virt ref page1
     al  w0  x2+d107   ;    op.4:=virt ref swoparea spec
     rs  w0  x1+4      ;
     rl. w2     b54.   ;    opch bankerque,start
     jl. w3    (b55.)  ;
     rl  w2  x3+d82    ;
     jl. w3    (b40.)  ;    lock answer
     rl  w2  x3+d110   ;
     jl. w3    (b40.)  ;    lock(job in core)
     al  w2  x3+d19    ;
     jl. w3    (b49.)  ;    stop and wait(jobname)
     rl  w2  x3+d106   ;    w2:=ref proc descr.
     rl  w1  x2+36     ;    w1:=ref interrupt routine
     al  w1  x1+e56    ;    w1:=ia.top reg.dump area;
     al  w2  x2+e56    ;    w2:=proc.top reg.dump area;
a0:  al  w1  x1-2      ; rep: move registers from proc
     al  w2  x2-2      ;
     rl  w0  x2+e57    ;    to ia;
     rs  w0  x1        ;
     se  w2 (x3+d106)  ;    if w2>proc.first register dump area
     jl.        a0.    ;    then goto rep;
     al  w0     8      ;
     rs  w0  x1+12     ;    interruptcause:=parent break
     al  w0     0      ;
     al  w1  x1+e56     ;    job ex:=0
     ds  w1  x3+34     ;    job ic:=ref interrupt routine+e56
     al  w1  x3+24     ;
     al  w3  x3+d19    ;    w3:=ref jobname
     jd         1<11+62;    modify process
     jd         1<11+58;    start process
     rl  w2  x3+d110-d19;
     jl. w3    (b41.)  ;    open(job in core)
     jl.        c21.   ;    goto receipt


c33: al  w0     22     ; finis(no interrupt):
     rl. w3     b0.+2  ;
     hs  w0  x3+d104   ;    finis cause:=22;
     rl. w2     b0.+8  ;
     al  w0     0      ;    op.2 := 0;
     hs  w0  x2+2      ;    allow next operation;
     jl.        c27.   ;    goto finis;

e.


f26=c27-b0             ; rel ref finis
f10=c6-b0              ; rel ref save and dump
f15=c1-b0              ; rel ref provoke before dump
f17=c36-b0             ; rel ref low priority start
f18=c37-b0             ; rel ref time exceeded

f24=k-b0               ; length of break page
\f


; boj 15.11.71                    boss 2, psjobfinis   ...49...


; clean catalog:
; page 1:  +0   return virt
;          +2   return rel
;          +4   top key (first not cleaned)
;          +6   interval:  low
;          +8              high
; page 3 must be the save buffer.
; page 3 is cleared before return.
; page 4 must be job descr

b. a9, j9, b30  w.     ;
j0=i62*512             ;    segments in save buffer * 512
j1=i62                 ;    segments in save buffer

f19:                   ; start of clean catalog page:
b0:      0,r.5         ;    page addr
     43<12 + 0         ;    page ident: clean catalog
b3:   3<12             ;    input message
b5:      0             ;    limit 1
b6:      0             ;    limit 2
b7:      7             ;    mask for catalog key
b8:  8.00007772        ;    mask for testpattern;
b17: <:catalog:>,0     ;    name of main catalog , 0 used by set base
b118:  285             ;      name table addr;
b18: -1-1<18-1<1       ;    hard error
b127:   21             ;    privat output
b147:    2             ;    send and wait fast
b148:   26             ;    ref ref current corutine
b149:    8             ;    page jump
j2:     j0-2           ;    last of save buffer

c20: rl  w1  x3+8      ;    high:= high + 1;
     al  w1  x1+1      ;    comment code trick used;
     rs  w1  x3+8      ;    in next entry;
     rl. w3     b0.+8  ;    w3:= job descr;
     rl. w1    (b148.) ;    w1 := ref ref current coroutine;
     bz  w0  x1+4      ;
     hs  w0  x3+d89+8  ;    save testpattern;
jd -1
     la. w0     b8.    ;    testpattern:= only jd -1;
jd -1
     hs  w0  x1+4      ;    
     rl. w0     b3.    ;    operation in message:= input;
     rs  w0  x3+d89    ;
     al  w1    -j1     ;    segment:= -segments in save buf;
     rs  w1  x3+d89+6  ;
a0:  rl. w3     b0.+8  ; input:
     rl  w1  x3+d89+6  ;    segment:= segments +
     al  w1  x1+j1     ;    segments in save buf;
     rs  w1  x3+d89+6  ;

a4:  rl. w1     b0.+6  ; 
     rl. w3     b0.+8  ;    w3:= job descr;
     al  w2  x1        ;
     wa. w2     j2.    ;    first addr:= abs ref save buf;
     ds  w2  x3+d89+4  ;    last addr:= first addr + save buf length;
     al  w1  x3+d89    ;    w1:= abs ref message;
     al. w2     b17.   ;    w2:= abs ref <:catalog:>;
     jl. w3    (b147.) ;    send and wait fast;
\f


; kll 12.03.73                    boss 2,clean catalog   ...50...



; w3 = parameter base(page 1)
; ***
     rl. w2     b0.+8  ;
     rl  w2  x2+d89+6  ;    w2 := segment;
     se  w0     0      ;    if anything wrong then
     jd        -1      ;    *** testoutput ***
     sn  w0     4      ; proc func trouble:
     jl.        a4.    ;    repeat at rejected;

     sz. w0    (b18.)  ;    if hard error then
c.-1, o42, z.          ;    (bossfault xref)
     jd        -42     ;    alarm;
     rl  w1  x1+2      ;
     sh  w1     0      ;    if bytes transferred = 0 then
     jl.        a3.    ;    goto return;
     wa. w1     b0.+6  ;
     al  w1  x1-2      ;    limit1:= bytes transferred +
     rs. w1     b5.    ;    abs save buf - 2;
     rl. w2     b0.+6  ;    w2:= entry:= abs ref save buf;
     al  w1  x2+510    ;    limit2:= abs ref save buf + 510;
     rs. w1     b6.    ;


a1:  rl  w0  x2        ; next:
     la. w0     b7.    ;    w0:= key(entry) extract 3;
     sl  w0 (x3+4)     ;    if not used or key >= top key then
     jl.        a2.    ;    goto get next;
     
     dl  w1  x2+4      ;    w0:= low(entry); w1:= high(entry);
     sl  w0 (x3+6)     ;    if low(entry) < low or
     sl  w1 (x3+8)     ;    high(entry) > high then
     jl.        a2.    ;    goto get next;
     al  w0     30<6+17;
     al  w1  x2        ;
     jl. w3    (b127.) ;    testout(entry);
     dl  w1  x2+4      ;
     al. w3     b17.+6 ;    w3:= abs ref 0;
     jd         1<11+72;    set base;
     al  w3  x2+6      ;    w3:= abs ref name(entry);
     jd         1<11+48;    remove entry;
     rl. w3     b0.+2  ;    w3:= ref page 1;

a2:  al  w2  x2+34     ; get next:   entry:= entry + 34;
     sn. w2    (b5.)   ;    if entry = limit1 then
     jl.        a0.    ;    goto input;

     se. w2    (b6.)   ;    if entry <> limit2 then
     jl.        a1.    ;    goto next;
     rl. w1     b6.    ;
     al  w1  x1+512    ;    limit2:= limit2 + 512;
     rs. w1     b6.    ;    comment skip last 2 bytes
     al  w2  x2+2      ;    on each catalog segment;
     jl.        a1.    ;    goto next;

a3:  am.       (b0.+2) ; return:
     dl  w3    +2      ;
     rl. w1     b0.+8  ;
     bz  w0  x1+d89+8  ;
     rl. w1    (b148.) ;    
     hs  w0  x1+4      ;    restore testpattern;
     al  w0     0      ;
     rs  w0  x1+12     ;    clear page 3 description;
     jl.       (b149.) ;    page jump(return point);
e.                     ;
f20=k-f19              ; length of clean catalog page
\f


; boj               boss 2, psjobfinis ...51...


;start of finis page

b100:     0            ;    page0 code and constants
          0            ;    page1 job description page
          0            ;    page2
          0            ;    page3 buffers
          0            ;    page4
     44<12 + 0         ;    page ident:  psjob finis
; constants
b102:     5<12         ;    output code
b8:       10           ;    radix (modified to 8 sometimes)
b9:       48           ;
b10:      -1-1<4       ;    mask
b14:      10000        ;
b101:     388          ;    job printer operation
b17:      60           ;    no of seconds pr. minute
b18:      <:.00:>      ;
b19:      48<8+32      ;
b20:      32<16        ;    space
b22:      <:sec  <0>:>      ;
b23:      <:  log :>   ;
b24:      0            ;    virt ref page 0
b25:      0            ;    rel ref clean catalog
b26:      <:  date:>   ;
b69:      <:wrk:>      ;    test for swoparea name (1)
b27:      10000*60*4   ;    for time conversion
b28:      10000*60     ;
b29:      15*24        ;
b30:      15           ;

b32:      1461         ;    no of days in 4 years
b33:      365          ;    no of days in 1 year
b34:      <:<10><10>end job <0>:>
b35:      <: 19:>      ;
b36:      <:<10>:>
b104:       0,r.6      ;    working space

b105:     0            ;    saved ref bstable,limit 1,saved shift
b106:     0            ;    saved ref monitorclaims,limit 2
b121:     -1-1<10      ;    replace bit mask
b103:     <:sub:>       ;
\f


; boj 11.11.1971                    boss 2, psjobfinis   ...52...


; externals

b92:      3            ;    lock
b93:      4            ;    open
b94:      2            ;    send wait fast
b95:      25           ;    call
b96:      26           ;    ref ref current corutine
b97:      415          ;    virt,
b98:      413          ;    rel ref prepare bs adjust
b99:      415          ;    virt,
b110:     414          ;    rel ref terminate bs adjust
b111:     67           ;    bankerque
b112:     6            ;    open chained
          0            ;    boss private interval
b117:     0            ;            =
b59:      312          ;    virt ref mount table
b70:      311          ;    virt ref mount action table
b71:      288          ;    slicelength on disc
b79:      74           ;    catalock semaphore
b60:      7            ;    get pages
b113:     51           ;    request que
b114:     5            ;    lock chained
b115:     8            ;    page jump
b65:      233          ;    virt ref save buffer
b66:      234          ;    abs ref operator name
b56:      440          ;    virt,
b67:      437          ;    rel ref empty files
b123:     33           ;    terminate access
b73:      492          ;    rel account job entry
b37:      313          ;    virt
b80:      477          ;    rel ref mounter finis entry
b81:      382          ;    convert free
b82:      380          ;    printer-paperque
b83:      381          ;    printerwait
b151:     378          ;    rb printer queue
b152:     377          ;    rb printer wait
b150:     379          ;    paper manipulation semafor
b84:      402          ;    replace exit
b85:      404          ;    offline finis exit
b86:      405          ;    online finis exit
b87:      400          ;    virt ref psjob start page
b88:      436          ;    print outrec account
b89:      431          ;  
b90:      434          ;    rel terminate account
b91:      435          ;    virt account buf
b128:     34           ;    w0 call
                       ;    jobprinter:
b130:     383          ;        virt first
b131:     384          ;        virt top jobprinter superbuffer
b132:     60           ;        empty
b133:     61           ;        full
b143:     206          ;    virt,
b144:     235          ;    rel ref get file
b107:     0            ;    virt ref finis texts
b109:     282          ;    addr of bankers time relative



\f

; boj   15.12.1971                    boss2, psjobfinis ...53...

; w3 = link, w2 = text base, w1 = integer
; w0, w2 unchanged at return

c8:  ds. w0     b104.+2; write integer:
     jl. w3     c42.   ;    ciffer 2;
     lo. w0     b19.   ;    add space;
     rs  w0  x2+4      ;
     jl. w3     c43.   ;    ciffer 3;
     lo  w0  x2+4      ;
     rs  w0  x2+4      ;   text + 4...;
     jl. w3     c41.   ;    ciffer 1;
     rs  w0  x2+2      ;
     jl. w3     c42.   ;    ciffer 2;
     lo  w0  x2+2      ;
     rs  w0  x2+2      ;
     jl. w3     c43.   ;    ciffer 3;
     lo  w0  x2+2      ;
     rs  w0  x2+2      ;   text + 2...;
     jl. w3     c41.   ;    ciffer 1;
     rs  w0  x2+0      ;
     jl. w3     c42.   ;    ciffer 2;
     lo  w0  x2+0      ;
     rs  w0  x2+0      ;
     jl. w3     c43.   ;    ciffer 3;
     lo. w0     b20.   ;
     lo  w0  x2+0      ;
     rs  w0  x2+0      ;    text + 0;
     dl. w0     b104.+2;    get saved w0;
     jl      x3        ;    goto return;


h3 =k-b100             ; harderror swopin:
     rl. w1     b100.+4;    w1 := operation;
     al  w0     0      ;
     hs  w0  x1+2      ;    operation := free;
     rl  w0  x1+4      ;
     rs  w0  x3+20     ;    save status on job descr rel 20;
     rl. w0     b69.   ;
     se  w0 (x3+d107)  ;    job descr(12:18) :=
     am         d18-d107;     if job was started then
     al  w2  x3+d107   ;        swop area name  else
     dl  w1  x2+2      ;        prog name;
     ds  w1  x3+14     ;
     dl  w1  x2+6      ;
     ds  w1  x3+18     ;
     al  w0     27     ;27:  finis cause := 27 ( harderror swopin );
     jl.        c45.   ;    goto set finis cause;
\f


; boj 15.11.71                    boss 2, psjobfinis   ...54...

; ciffer 1, ciffer 2, ciffer 3

c43: am         8      ; ciffer 3:   shift:= 16;
c42: am         8      ; ciffer 2:   shift:= 8;
c41: al  w0     0      ; ciffer 1:   shift:= 0;
     rs. w0     b105.  ;
     al  w0     0      ;    w0:= w1 mod radix;
     wd. w1     b8.    ;    w1:= w1//radix;
     sn  w0     0      ;
     se  w1     0      ;
     lo. w0     b9.    ; 
     ls. w0    (b105.) ;    w0:=(w0 or text bits) < shift;
     jl      x3        ;    goto return;


; release request line
; call:   w0 = line addr, w2 = return.

c22: sh  w0     0      ; release request:
     jl      x2        ;    if line = 0 then return;
     ws. w2     b100.  ;
     rs  w2  x3+d14+26 ;    save rel return;
     al  w1  x3+d87    ;    w1:= operation;
     rs  w0  x1+6      ;    operation + 6:= line;
     al  w0     1      ;
     rs  w0  x1+2      ;    code:= release line;
     rl. w2     b113.  ;
     jl. w3    (b112.) ;    open chained(request que);
     rl  w2  x3+d82    ;
     jl. w3    (b92.)  ;    lock(psjob answer);
     rl  w2  x3+d14+26 ;
     jl.     x2+b100.  ;    goto saved return;

; output page 3:

c23: ws. w2     b100.  ; output page 3:
     rs  w2  x3+d14+16 ;    save rel return in w16;
     rl. w1     b100.+6;    w1:= abs ref page 3;
     rl. w0     b102.  ;    message code:= output;
     ds  w1  x3+d11+2  ;    first addr:= page 3; (virt buf);
     al  w0  x1+510    ;    last addr:= first addr + 510;
     rl  w1  x3+d14+32 ;
     ls  w1    -9      ;    segment:= first buf byte // 512;
     ds  w1  x3+d11+6  ;
     al  w1  x1+1      ;
     ls  w1     9      ;
     rs  w1  x3+d14+32 ;    w32:= (segment + 1) * 512;
     al  w1  x3+d11    ;    a1:= abs ref message;
     al  w2  x3+d112   ;    w2:= abs ref super buffer name; 
     jl. w3    (b94.)  ;    send and wait fast;
     sz  w0  -1-1<5-1<1;    if other than normal answer or not exist then
c.-1, o43, z.          ;    (bossfault xref)
     jd        -43     ;    alarm;
     rl  w1  x3+d14+16 ;
     jl.     x1+b100.  ;    goto saved return;
\f


; boj 27.12.71                    boss 2, psjobfinis   ...55...

; finis entries:
b. a15,j15 w.

c17: am         5      ; 8:   end medium prim output
c13: al  w0     3      ; 3:   finis request
     bz  w2  x3+d104   ;
     sn  w2     0      ;    if finis cause not set then
c45: hs  w0  x3+d104   ;    set finis cause;
c2:  se  w0     3      ;    if finis cause = finis request then
     jl.        a13.   ;    begin
     rl. w2     b100.+8;      w2:=operation
     rl  w2  x2+4      ;      w2:=message address
     rl  w2  x2+14     ;      take finis parameters
     jl.        a10.   ;    end else
a13: al  w2     0      ;    clear parameter mask
a10: rs  w2  x3+d5     ;    set parameter mask
jd-1
     rl  w1     66     ;   w1:=ref to curr process
     rl  w0  x1+12     ;   w0:=boss identification bit
     rl  w3 (x3+d108)  ;   w3:=ref to proc desc of this job
     lo  w0  x3+12     ;   w0:=userbit of boss and job
     rl  w3     74     ;   w3:=first of per. dev.
     al  w3  x3-2      ;
a11: al  w3  x3+2      ; rep:
     sl  w3    (76)    ;   if no more per. dev. then
     jl.        a12.   ;    goto continue finis
     rl  w2  x3        ;   w2:= proc desc of device
     rl  w1  x2+2      ;   w1:=first of name
     sn. w1    (b103.) ;   if w1 <> <:sub:> or
     se  w0 (x2+14)    ;     users <> boss and job then
     jl.        a11.   ;    goto rep
     al  w1  x3        ;   w1:= name table add
     ws  w1     74     ;   w1:=w1- start of name table
     ls  w1     -1     ;   w1:=w1 div 2
     ds. w0     b104.+10;   save w3,w0
     rl. w3     b100.+2;
     al  w3  x3+d19    ;   w3:= ref to job name
     jd         1<11+14;   exclude user (device as user)
jd-1
     rl. w3    (b104.+8);   w3:=ref to proc desc of device
     dl  w1  x3+2+2     ;
     ds. w1     b104.+2;   store name of device
     dl  w1  x3+2+6    ; 
     ds. w1     b104.+6;   in local variables
     al. w3     b104.  ;   w3:= ref to name of device
     jd         1<11+64;   remove process (device)
jd-1
     dl. w0     b104.+10;   restore w3,w0
     jl.        a11.   ;   goto rep
a12: rl. w3     b100.+2; continue finis:
     al  w1  x3+d14    ;    w1:= ref bankerop
     bz  w2  x3+d88    ;
     bz  w0  x3+d104   ;    w0 := finiscause;
     sz  w2     1<9    ;    if convertjob
     se  w0     3      ;      and finiscause = ok then
     jl.        4      ;
     jl.        c44.   ;        goto release;
     so  w2     1<10+1<1;   if (replace job and
     so  w2     1<10   ;      no username change and
     jl.        a5.    ;      not killed)
     se  w0     1      ;
     sn  w0     6      ;
a5:  sz  w2     1<3    ;    or online then
     am         29-27  ;    code:= stop job and release core else
     al  w0     27     ;
     hs  w0  x1+2      ;    code:= stop job and clear name;
     rl. w2     b111.  ;
     jl. w3    (b112.) ;    open chained(banker que);
     rl  w2  x3+d82    ;
     jl. w3    (b92.)  ;    lock(psjob answer);
     dl. w3     b98.   ;
     jl. w1    (b95.)  ;    call (prepare bs adjust);
     al  w2     0      ;    w2:=ref proc descr
     rs  w2 (x3+d108)  ;    ref proc descr:=0
     rs  w2  x3        ;    page1.0:=0
     rx  w2  x3+d106   ;    ref proc descr:=0
     sn  w2     0      ;    if proc dosnt exist
     jl.        a0.    ;    then skip removal
     dl  w1  x2+56     ;
     ad  w1     11     ;    update cpu time used;
     wa  w0  x3+d79    ;
     rs  w0  x3+d79    ;
     rl  w2     66     ;    
     dl  w1  x2+78     ;    w0w1:=boss standard ; w3=ref(0)
     jd     1<11+72    ;    set catbase(w0w1w3)
     am        (66)    ;    w1w2 := boss cpu time;
     dl  w2    +56     ;
     al  w3  x3+d19    ;    w3:=ref jobname
     jd    1<11+64     ;    remove process
     am        (66)    ;    w1w2 := old boss cpu - new boss cpu;
     ss  w2    +56     ;
     ad  w2    -13     ;
     wa. w2    (b109.) ;    update bankers time relative
     rs. w2    (b109.) ;
     rl. w3     b100.+2;
     rl. w0     b69.   ;    if job was not started at all then
     rx  w0  x3+d107   ;      begin
     al  w2  x3+d18    ;      swop area name (1) := <:wrk:>;
     se  w0 (x3+d107)  ;      terminate access(prog name);
     jl. w3    (b123.) ;      end;
     dl. w1     b117.  ;    w0w1:=boss private
     rl. w3     b100.+2;    w3:=ref(0)
     jd    1<11+72     ;    set catbase
     al  w3  x3+d107   ;    w3:=ref swopareaname
     jd    1<11+48     ;    remove entry(w3)
     rl. w3     b100.+2; 
a0:  rl. w2    (b96.)  ;    page3:=jobfile page
     rl  w0  x3+d0     ;
     rs  w0  x2+12     ;
     jl. w3    (b60.)  ;    getpages;

\f



; boj 20.3.72                    boss 2, psjobfinis   ...56...


; this  very code was once repeated on aux page.
; ( except for the end signal and the account counting)
     rl. w1     b100.+6;   w1:=ref job file page;
j10: rl  w0  x1+179    ;   if job printer allowed then
     so  w0     1<1    ;
     jl.        a3.    ;   begin
     sz  w0     1<6    ;   if job printer not accounted then
     jl.        a6.    ;     begin
     rl  w2  x3+d111   ;     rest accounts:=rest accounts + 1;
     al  w2  x2+1      ;
     rs  w2  x3+d111   ;     end
     jl.        a3.    ;   else begin

a6:  sz  w0     1<4    ;   if job printer not used then
     jl.        a7.    ;     begin
 
     rl. w2     b101.  ;     lock chained(job printer operation);     
     jl. w3    (b114.) ;

     al  w0     3      ;     send print-account record;
     rs  w0  x3+4      ;     page 1 + 4:=print;
     bz  w0  x1+5      ;
     rs  w0  x3+20     ;            +20:=last printed paper type;
     dl  w1  x1+46     ;            + 6:=pages from operation;
     ds  w1  x3+8      ;            + 8:=lines from operation;
     rl. w1     b100.+4;
     rl. w2     b101.  ;
     jl. w3    (b112.) ;     open chained(job printer operation;
     dl  w1  x3+d23+2  ;
     ds  w1  x3+12     ;         +(10-16):=user name;
     dl  w1  x3+d23+6  ;
     ds  w1  x3+16     ;
     rl  w1  x3+d20    ;            +18:=project no;
     rs  w1  x3+18     ;
     rl. w1    (b96.)  ;     page 3:=virt account buf;
     rl. w0     b91.   ;
     rs  w0  x1+12     ;
     dl. w3     b89.   ;     call (outrec account);
     jl. w1    (b95.)  ;
     rl  w0  x3+d0     ;
     rl. w2    (b96.)  ;     page 3:= job file page;
     rs  w0  x2+12     ;
     jl. w3    (b60.)  ;     get pages;
     jl.        a3.    ;     end
\f


; re 20.3.74                   boss 2, psjobfinis   ...56a...

a7:                    ;   else begin
     la. w0     b10.   ;      -1-1<4;
j11: rs  w0  x1+179    ;      jobprinter used:= false;
j12: rl  w0  x1+181    ;
     se  w0     0      ;      if rest = 0 then
     jl.        a4.    ;      begin comment change share;
     al  w0     512    ;
j3:  rs  w0  x1+181    ;        rest:= 512;
j4:  wa  w0  x1+183    ;        share:= next share;
     sl. w0    (b131.) ;
     rl. w0     b130.  ;
j5:  rs  w0  x1+183    ;
     rl. w2     b133.  ;
     jl. w3    (b93.)  ;        open(full);
     rl. w2     b132.  ;
     jl. w3    (b92.)  ;        lock(empty);
     rl. w1     b100.+6;
a4:  rl. w2    (b96.)  ;      end;
j6:  rl  w0  x1+183    ;      page 2:= share;
     rs  w0  x2+10     ;
     jl. w3    (b60.)  ;      getpages;
     dl. w2     b100.+6;      w1:=ref share; w2:=ref jobfile page;
     rl. w3    (b96.)  ;      w3:=ref own description;
j7:  ws  w1  x2+181    ;      buffer(512 - rest):= -2
     al  w0    -2      ;      = end signal to printer.
     rs  w0  x1+512    ;
     al  w0     0      ;      page 2:= 0;
     rs  w0  x3+10     ;
     rl. w2     b133.  ;
     jl. w3    (b93.)  ;      open(full);
                       ;      end;
a3:                    ;    end;

b134 = j10+1, b135 = j11+1, b136 = j12+1, b137 = j3 +1
b138 = j4 +1, b139 = j5 +1, b140 = j6 +1, b141 = j7 +1

\f

;boj 22.2.72                boss 2, psjobfinis  ...57...

     bl  w0  x3+d88    ;
     sz  w0     1<3    ;    if offline or internal job then
     jl.        a2.    ;    begin
j1:  al  w2     218    ;
     wa. w2     b100.+6;
     jl. w3    (b123.) ;      terminate access(jobfile)
j2:  al  w2     218    ;
     wa. w2     b100.+6;
     al  w0     0      ;
     rs  w0  x2+8      ;      nametableaddress:=0
     bl  w0  x3+d88    ;      if offline job then
     so  w0     1<8    ;
     jl.        a1.    ;
     al  w3  x2        ;
     jd         1<11+48;        remove jobfile;
     rl. w3     b100.+2;
a1:  am         1      ;      topkey:=3
a2:  al  w0     2      ;    end else topkey:=2;
     rs  w0  x3+4      ;
     dl  w1  x3+d24    ;    interval:=job standard
     ds  w1  x3+8      ;    
     rl. w2    (b96.)  ;    w2:= ref current corutine;
     rl. w0     b65.   ;
     rl  w1  x2+8      ;    page 3:= save buffer;
     ds  w1  x2+14     ;    page 4:= page 1; (job descr);
     bz  w0  x3+d134   ;    if preserve yes then
     se  w0     0      ;
     jl.        a8.    ;    skip clean catalog
     dl. w3     b25.   ;
     jl. w1    (b95.)  ;    call clean catalog;
a8:  rl. w2    (b96.)  ; 
     rl  w0  x3+d0     ;
     rs  w0  x2+12     ;    page 3:= job file page;
     dl. w3     b110.  ;
     jl. w1    (b95.)  ;    call terminate bs adjust;
c.-1, o44, z.          ;    (bossfault xref)
     jd        -44     ;    if claims exceeded then boss alarm;
     dl. w3     b67.   ;
     jl. w1    (b95.)  ;    call empty files;
b125=j1+1,b126=j2+1
e.                     ;    end a-names
\f


; boj 15.11.71                    boss 2, psjobfinis   ...58...


c. e25-1               ; if stations > 0 then
                       ; begin
     bl  w0  x3+d98    ;    if rest mounts = mounts then
     bl  w1  x3+d43    ;    goto exit
     sn  w0  x1        ;
     jl.        c5.    ;

     rl. w1    (b96.)  ;
     dl. w0     b70.   ;    page 1:= mount table;
     rx  w3  x1+8      ;    page 3:= descr;
     ds  w0  x1+14     ;    page 4:= mount action table;
     dl. w3     b80.   ;    w2w3:= ref finis entry in mounter;
     jl.       (b115.) ;    page jump;

c5:                    ; return from mounter:
z.                     ; end stations > 0;
\f


; boj 15.11.71                    boss 2, psjobfinis   ...59...


b. a9, j9  w.          ;
     al  w0     0      ;    requestaddr := 0;
     rx  w0  x3+d93    ;
     jl. w2     c22.   ;    release request;
     bz  w0  x3+d14+3  ;
     se  w0     2      ;    if psjob nr = 2 then
     jl.        a0.    ;    begin
     rl. w1    (b96.)  ;      comment account psjobnr;
     dl. w0     b91.   ;
     rs  w0  x1+12     ;      page 3:= virt account buf;
     rl. w2     b88.   ;      call terminate account;
     jl. w1    (b95.)  ;    end;
c44:                   ; release:
a0:  al  w1     2      ;    init banker operation(release) :
     hs  w1  x3+d14+2  ;    op.2 := 2<12 + psjobno;
     ld  w1    -100    ;    op.4 := converts, accounts := 0, 0;
     ds  w1  x3+d14+6  ;    op.6 := entries , slices   := 0, 0;
     bz  w0  x3+d88    ;    if offline or internal job then
jd -1
     sz  w0     1<3    ;    begin
     jl.        a6.    ;      remove or adjust primout :
     rl  w0  x3+d0     ;
     rl. w2    (b96.)  ;
     rs  w0  x2+12     ;      page 3 := job file page;
     rl. w2     b79.   ;
     jl. w3    (b92.)  ;      lock(catalock);
     dl. w1     b117.  ;
     al  w3  x3+d105   ;
     jd         1<11+72;      set catbase(boss own base);
     rl  w0  x3-d105+d5;      if finis output.no then
jd -1
     so  w0     1<0    ;      begin
     jl.        a2.    ;        remove primout :
     al  w3  x3-d105+d112;
     jd         1<11+48;        remove entry(primout);
     al  w2     1      ;
     se  w0     0      ;        if not ok then
     jd        -46     ;        *** bossfault(46,w2=1);
     c.-1, o46, z.     ;        (bossfault xref)
     al  w0     1      ;        accounts :=
     hs  w0     2      ;        entries  :=
     hs  w0     0      ;        converts := 1;
     hl  w1  x3-d112+d90;       slices to release := slices reserved;
     jd        -1      ;        *** testoutput ***
     ds  w1  x3-d112+d14+6;     store in banker operation;
     jl.        a5.    ;      end else
\f


; jma 1978.06.12                  boss 2, psjobfinis  ...59a...

; release (cont.)


a2:  al  w1  x3-d105+d89;     begin
     al  w3  x3-d105+d112;      adjust primout size :
     jd         1<11+42;        lookup entry(primout);
     al  w2     2      ;
     se  w0     0      ;        if not ok then
     jd        -46     ;        *** bossfault(46,w2=2);
     c.-1, o46, z.     ;        (bossfault xref)
     rl. w2     b100.+6;        w2 := absref jobfile page;
j3:  rl  w2  x2+194    ;        segments used := first buf byte
jd -1
     ls  w2    -9      ;        // 512
     al  w2  x2+2      ;        + 2; (because 2 segments still
     rl  w0  x1        ;              remain to be written)
     jd        -1      ;        *** testoutput ***
     sn  w0  x2        ;        if old size = segments used
     jl.        a5.    ;        then skip change; 
     sl  w0  x2        ;
     jl.        a3.    ;
     al  w1     1      ;        if old size < segments used then
     jd        -49     ;        *** bossfault(49,w1=1);
     c.-1, o49, z.     ;        (bossfault xref)
a3:  rs  w2  x1        ;        set new size in tail;
     jd         1<11+44;        change entry(primout,new size);
     al  w1     2      ;
     se  w0     0      ;        if not ok then
     jd        -49     ;        *** bossfault(49,w1=2);
     c.-1, o49, z.     ;        (bossfault xref)
     al  w1     0      ;        slices used := segments used
     wd. w2     b71.   ;        // slicelength on disc;
     se  w1     0      ;
     al  w2  x2+1      ;        maybe round up;
     bz  w1  x3-d112+d90;       slices to release :=
     ws  w1     4      ;        slices reserved - slices used;
     jd        -1      ;        *** testoutput ***
     hs  w2  x3-d112+d90;       store(slices used);
     hs  w1  x3-d112+d14+7;     store(slices to release);
a5:  al  w0     0      ;      end;
     rl. w2    (b96.)  ;
     rs  w0  x2+12     ;      page 3:= 0;
     rl. w2     b79.   ;
     jl. w3    (b93.)  ;      open(catalock);
a6:                    ;    end offline or internal;
\f


; jma 1978.06.12                  boss 2, psjobfinis  ...59b...

; release (cont.)


                       ; release restclaims:
     rl  w0  x3+d111   ;    converts:= converts + rest converts;
                       ;    accounts:= accounts + rest accounts
     ba  w0     0      ;    + rest converts;
c.-i27,rl w1 x3+d58 z. ;    entries:= entries
c. i27,rl w1 x3+d59    ;    + rest maincat entries;
     hl  w1  x3+d58+1  ;    slices:= slices + rest slices;
z.,  aa  w1  x3+d14+6  ;
     ds  w1  x3+d14+6  ;    add in operation;
     al  w1  x3+d14    ;
     rl. w2     b111.  ;
     jl. w3    (b112.) ;    open chained(banker,operation);
     rl  w2  x3+d82    ;       (after return op.4 contains net run left)
     jl. w3    (b92.)  ;    lock(psjob answer);

                       ; save runtime:
     rl  w1  x3+d2     ;    runtime := net time
     ws  w1  x3+d14+4  ;    - net run left;
     al  w0     0      ;
     ld  w1     13     ;    convert to seconds;
     wd. w1     b14.   ;    store value for use in
     rs  w1  x3+d14+4  ;    'end job'-line and accountrecord;
\f


; jma 1978.06.12                  boss 2, psjobfinis  ...59c...

; check replace-jobfile (if any).


     bz  w0  x3+d88    ;
     so  w0     1<10   ;    if replace then
     jl.        a1.    ;    begin
     rl. w1    (b96.)  ;    
     rl  w0  x3+d0     ;      page 1:= job file page;
     rs  w0  x1+8      ;     
     jl. w3    (b60.)  ;      get pages;
     rl. w2     b100.+8;
     dl  w1  x2+d100+2 ;
     ds  w1  x3+6      ;      param 1:= job file name;
     dl  w1  x2+d100+6 ;
     ds  w1  x3+10     ;
     dl  w1  x2+d101+2 ;
j2:  ds  w1  x3+227    ;
j1:  al  w0  x3+257    ;      w0 call(get file);
     dl. w3     b144.  ;
     jl. w1    (b128.) ;      w0:= case return of
     am        -1      ;      replace job file unreadable;
     am         34     ;      replace job file too long;
     al  w0     0      ;      replace;
     rl. w3     b100.+8;      w3:= job descr page;
     bl  w1  x3+d104   ;      if finis cause = normal finis
     se  w1     4      ;      or finis cause = job file exhausted
     sn  w1     3      ;      then finis cause:= w0;
     hs  w0  x3+d104   ;    
     bz  w2  x3+d88    ;      
     la. w2     b121.  ;
     se  w0     0      ;      if w0 <> replace then
     hs  w2  x3+d88    ;      replace bit:= 0;
a1:  bz  w0  x3+d88    ;    end;
     sz  w0     1<3    ;
     jl.        a7.    ;
     rl  w0  x3+d5     ;    if (offline or internal)
     sz  w0     1<0    ;       and finis output.no
     jl.        c50.   ;    then goto receipt;
a7:                    ;
b129=j1+1, b145=j2+1, b72=j3+1         
e.                     ;
\f


; boj 15.11.71                    boss 2, psjobfinis   ...60...
;  clear the remaining unused part of the primout buffer,
;  thereby provoking a buffer change, which enables the end
;  job message to start at the beginning of a segment.



b. a9, j9  w.          ;
     rl  w0  x3+d0     ;
     rl. w2    (b96.)  ;
     rs  w0  x2+12     ;    page 3:= job file page;
     rl  w0  x2+14     ;
     rs  w0  x2+8      ;    page 1:= page 4(job descr);
     jl. w3    (b60.)  ;    get pages;

     rl. w2     b100.+6;    w2:= abs ref job file page;

j0:  rl  w0  x2+193    ;    comment move variables from job file page
     rl. w1    (b96.)  ;    to job description page;
     rs  w0  x1+12     ;    page 3:= virt buf;
j1:  rl  w0  x2+191    ;    w30:= rest room on page;
j2:  rl  w1  x2+194    ;    w32:= first buf byte;
     ds  w1  x3+d14+32 ;    first buf byte:=
     al  w1  x1+512    ;    first buf byte + 512;
j3:  rs  w1  x2+194    ;
j4:  rl  w0  x2+197    ;
     rs  w0  x3+d14+28 ;    w28:= terminal full;
                       ;    comment w18...w26 unused;
     jl. w3    (b60.)  ;    get pages;

     rl. w2     b100.+6; clear rest:
     al  w1  x2        ;
     ws  w2  x3+d14+30 ;    w2:= page - rest;
     al  w0     0      ;    w1:= page;
a0:  sl  w2  x1        ; rep:
     jl.        a1.    ;    if w2 = w1 then goto exit;
     rs  w0  x2+512    ;    page(w2 + 512):= 0;
     al  w2  x2+2      ;    w2:= w2 + 2;
     jl.        a0.    ;    goto rep;

a1:  jl. w2     c23.   ;    output page 3;

b74=j0+1, b75=j1+1, b76=j2+1, b77=j3+1, b78=j4+1
e.                     ;    end a-names, j-names
\f


; boj 15.11.71                    boss 2, psjobfinis   ...61...


; comment pack finis text on primary output.
b. j90  w.
b. a20  w.             ;
     rl. w2     b100.+6;
j31=0
     al  w0    -2      ;    start signal to printer
     rs  w0  x2+j31    ;    or terminal output;
j31=j31+2
     al  w0     0      ;
     al  w1  x2+j51    ;
a10: rs  w0  x1        ;    clear the output buffer
     al  w1  x1-2      ;
     sl  w1  x2+j31    ;
     jl.        a10.   ;

     dl. w1     b34.+2 ;    move 4 bytes;
     ds  w1  x2+j31+2  ;
j31=j31+4

                       ;    write runtime, 6 bytes:
     rl  w1  x3+d14+4  ;    w1 := runtime;
     al  w2  x2+j31    ;    w2:=current text base;
     jl. w3     c8.    ;    write integer;
     rl. w3     b100.+2;    w3:=abs page 1;
     al  w2  x2-j31    ;    w2:=text base;
j31=j31+6

     bl  w0  x3+d88    ;    if information not wanted
     bz  w1  x3+d102   ;       and online
     sz  w0     1<3    ;       or convert from commandio
     sn  w1     0      ;    then omit further textual information else
     sz  w0     1<9    ;
     jl.        a9.    ;    begin
     dl. w1     b22.+2 ;    move 4 bytes;
     ds  w1  x2+j31+2  ;    <:sec   :>;
j31=j31+4
     dl. w1     b34.+6 ;    <:<10><10>end :><:job :>;
     ds  w1  x2+j31+2  ;    move 4 bytes;
j31=j31+4
 
     dl  w1  x3+d19+2  ;    move 8 bytes;
     ds  w1  x2+j31+2  ;
     dl  w1  x3+d19+6  ;    job name;
     ds  w1  x2+j31+6  ;
j31=j31+8

     dl. w1     b23.+2 ;    move 4 bytes;
     ds  w1  x2+j31+2  ;    <:  log :>;
j31=j31+4

     rl. w3     b66.   ;    move 8 bytes;
     dl  w1  x3+2      ;
     ds  w1  x2+j31+2  ;
     dl  w1  x3+6      ;    <operator name>;
     ds  w1  x2+j31+6  ;
j31=j31+8

     dl. w1     b26.+2 ;    move 4 bytes;
     ds  w1  x2+j31+2  ;    <:  date:>;
j31=j31+4
                       ;    end;
a9:
\f


; boj 15.11.71                    boss 2, psjobfinis   ...62...


                       ; generate date and time:
     jd         1<11+36;    get clock(w0, w1);
     ld  w3    -100    ;
     wd. w1     b27.   ;    w1:= fourmin:= clock // (10000 * 60 * 4);
     wd. w0     b28.   ;    clock:= clock mod (10000 * 60 * 4);
     wd. w3     b14.   ;    min:= clock // (10000 * 60);
     rs. w0     b105.  ;    clock:= clock mod (10000 * 60);
     al  w0     0      ;    w3:= sec:= clock // 10000;
     wd. w1     b29.   ;    w1:= days:= fourmin // 360;
     rx  w3     0      ;    w0:= w3:= sec; w3:= fourmin:= fourmin mod (15 * 24);
     al  w2     0      ;    w3:= hour:= fourmin // 15;
     wd. w3     b30.   ;    w2:= fourmin:= fourmin mod 15;
     as  w2     2      ;
     wa. w2     b105.  ;    w2:= min:= fourmin * 4 + min;
     ds. w3     b104.+2;    save min, hour;
     ds. w1     b104.+6;    save sec days;
     ld  w0    -100    ; julian calendar:
     wd. w1     b32.   ;    w1:= years:= days // 1461 * 4 + 64;
     as  w1     2      ;    w0:= days:= days mod 1461;
     al  w1  x1+68     ;   
     se  w0     59     ;    if days = 59 then
     jl.        a1.    ;    begin comment leap year;
     al  w2     2      ;      w2:= month:= 2;
     al  w3     29     ;    w3:= date:= 29;
     jl.        a3.    ;    goto date found;
                       ;    end;

; comment b104: min, hour, sec, month, date, year


h. a0=k-1
 -1, 30, 58, 89,119,150  ; month table:
180,211,242,272,303,333  ;    accumulated -1
w.

a1:  sl  w0     59+1   ;    if days > 59 then
     bs. w0     1      ;    days:= days - 1;
     wd. w0     b33.   ;    year:= year + days // 365;
     wa  w1     0      ;    days:= days mod 365;
     al  w2     13     ;    w2:= month:= 13;
a2:  al  w2  x2-1      ; search month:
     bl. w0  x2+a0.    ;    w2:= month:= month - 1;
     sh  w3    (0)     ;    if days <= month table(month)
     jl.        a2.    ;    then goto search month;
     ws  w3     0      ;    date:= days - month table month;
a3:  rs. w1     b104.+10; date found:    save year;
     ds. w3     b104.+8;    save month, date;

     al. w2     b104.  ;    index:= 0;
a4:  rl  w1  x2        ; rep:   w1:= b104(index);
     jl. w3     c41.   ;    ciffer 1;
     rs. w0     b106.  ;
     jl. w3     c42.   ;    ciffer 2;
     lo. w0     b106.  ;
     lo. w0     b18.   ;    b104(index):= point < 16 + ciffer 2 < 8 + ciffer 1;
     rs  w0  x2        ;
     al  w2  x2+2      ;    index:= index + 2;
     sh. w2     b104.+10;    if index <= 10 then
     jl.        a4.    ;    goto rep;
\f


; boj 15.11.71                    boss 2, psjobfinis   ...63...



     rl. w2     b100.+6;    w2:= abs ref page 3;
     rl. w0     b35.   ;    <: 19:>;
     rl. w1     b104.+10;    year;
     ls  w1     8      ;    omit point;
     ds  w1  x2+j31+2  ;
     dl. w1     b104.+8;    month, date
     ds  w1  x2+j31+6  ;
     al  w3     32     ;
     dl. w1     b104.+4;    space, hours;
     ld  w0     8      ;    convert point to space;
     al  w3  x3+32-46  ;
     ds  w0  x2+j31+10 ;
     rl. w0     b104.  ;
     ds  w1  x2+j31+14 ;    min, secs;
j31=j31+16

     rl. w0     b36.   ;    move 2 bytes;
     rs  w0  x2+j31    ;    <:<10>:>;
j31=j31+2              ;
j51=j31

     rl. w1    (b96.)  ; move finis text:
     rl. w0     b107.  ;    page 2:= finis cause text page;
     rs  w0  x1+10     ;
     jl. w3    (b60.)  ;    get pages;
     dl. w2     b100.+6;    w2:= base of end job buffer page;
     ba  w1  x3+d104   ;
     bl  w1  x1+j80    ;    w1:= abs ref finis text(finis cause);
     wa. w1     b100.+4;
     al  w0     j31+2  ;    w0:= length of previous text +
     ba  w0  x1-1      ;    signal word + variable text;
     wa  w2     0      ;    w2:= param base;
     bl  w3  x1-2      ;
     rs. w1     b106.  ;    save finis text;
     rl. w1     b100.+2;    w1:= description page;
     jl.     x3+j32.   ;    goto param action;

j32: rl. w3     b100.+2; after param action:
     rl. w1     b106.  ;    w1:= ref finis text;
     wa  w0  x3+d14+30 ;
     rs  w0  x3+d14+30 ;    rest:= rest + w0;
     rl. w0     b36.   ;
     rs  w0  x2-2      ;    <:<10>:>
     al  w0    -1      ;    set signal to printer
     rs  w0  x2        ;    or terminal output;
     al  w0     25     ;    end signal, in case of
     rs  w0  x2+2      ;      printing by saveconv;
     rl. w2     b100.+6;    w2:= text base;
     al  w3  x2        ;    w3:= limit:=
     ba  w3  x1-1      ;    text base + length(cause);
a5:  sl  w2  x3        ;    while w2<limit
     jl.        a8.    ;    do begin
     rl  w0  x1        ;      move(w1,w2)
     rs  w0  x2+j31    ;
     al  w1  x1+2      ;      w1:=w1+2
     al  w2  x2+2      ;      w2:=w2+2
     jl.        a5.    ;    end
a8:  rl. w3     b100.+2;
     jl. w2     c23.   ;    output page 3;
\f


; boj 15.11.71                    boss 2, psjobfinis   ...64...


c50: rl. w2    (b96.)  ; receipt:
     rl  w0  x2+14     ;
     rs  w0  x2+8      ;    page 1:= page 4; (job descr page)
     al  w0     0      ;    page 3:= 0;
     rs  w0  x2+12     ;
     jl. w3    (b60.)  ;    get pages;
     rl  w1  x3+d108   ;    w1 := ref sender table entry;
     al  w2     0      ;    w2 := ref message buffer;
     rx  w2  x1+8      ;    ref message buffer := 0;
     al  w0     1      ;    w0 := normal answer;
     al  w1  x3+d14+10 ;    w1:= ref working space;
     sl  w2     2      ;    if no one else did then
     jd         1<11+22;       send answer;

     bz  w0  x3+d88    ;
     so  w0     1<3    ;    if job state = online then
     jl.        a6.    ;    begin

     rl  w2  x3+d14+28 ;      
     jl. w3    (b93.)  ;      open(terminal full);

     rl  w1  x3+d14+30 ;      rest:= rest // 2 - 1;
     ls  w1    -1      ;    comment rest does not contain the final nl
     rl  w2  x3+d14+28 ;      w2:= abs ref terminal full
     wa  w1  x2        ;      sem(w2):= sem(w2) + rest;
     rs  w1  x2        ;
     jl.        a7.    ;    end else
a6:  rl  w0  x3+d5     ;    begin
     sz  w0     1<0    ;      if primout.no then
     jl.        a7.    ;      skip convertion of primout
     dl. w1     b117.  ;    
     al  w3  x3+d105   ;      set base(boss private);
     jd         1<11+72;
     al  w3  x3+d112-d105;
     jd         1<11+64;      remove process(primout);
     se  w0     0      ;      if not ok then
c.-1, o47, z.          ;    (bossfault xref)
     jd        -47     ;        boss fault(47);
     rl. w2     b81.   ;    
     jl. w3    (b114.) ;      lock chained(convert free);
     rl. w2     b150.  ;
     jl. w3    (b92.)  ;      lock(paper manipulation);
     rl. w1     b100.+4;
     bz  w0  x3+d90    ;      release slices:=output slices
     ls  w0     12     ;      paper:=0
     al  w3     1      ;      type:= prim output;
     ds  w0  x1+4      ;
     ld  w0    -100    ;      op + 40, 42:=0;
     ds  w0  x1+42     ;
     ds  w0  x1+46     ;      op+44, 46:=0;
     rl. w2     b100.+2;      w2:= abs ref page 1;
     dl  w0  x2+d112+2 ;
     ds  w0  x1+8      ;      op + 6, ...,+12:= doc name
     dl  w0  x2+d112+6 ;     primary output;
     ds  w0  x1+12     ;
     dl. w0     b117.  ;      w3w0 := boss private interval;
     ds  w0  x1+18     ;      op + 16, +18:= boss priv base;

\f


; boj 15.11.71                    boss 2, psjobfinis   ...65...
b.  j5  w.

     
     dl  w0  x2+d23+2  ;
     ds  w0  x1+24     ;      op + 24,...+28:= user name;
     dl  w0  x2+d23+6  ;
     ds  w0  x1+28     ;

     rl  w0  x2+d20    ;      op + 20:= project;
     rs  w0  x1+20     ;
     rl  w0  x2+d61    ;      op + 30:= addr of
     rs  w0  x1+30     ;      user id in user cat;
     dl  w0  x2+d26    ;
     ds  w0  x1+66     ;    set catalog base = project base (not maxbase)
     dl  w0  x2+d122   ;    name table addr of parent rb device
     ds  w0  x1+50     ;    creation number of parent rb device
     rl  w0  x2+d122   ;    rb term ident
     rs  w0  x1+52     ;
     dl  w0  x2+ d121  ;
     ds  w0  x1+56     ;    rb printername
     al  w0     14     ;
     rs  w0  x1+62     ;    device kind:=printer;
c. i190-1
; if any printername in the convertbuffer then put it into the remote que
     sn  w3     0      ;    and primout to rbprinter then
     jl.        a11.   ;    begin
     rl. w2     b151.  ;
     jl. w3    (b112.) ;      openchained(rbprinter queue)
     rl. w2     b152.  ;  
     jl. w3    (b93.)  ;      open(rbprinter wait)
     jl.        a12.   ;    end else
z.                     ;    begin
a11: rl. w2     b82.   ;    
     jl. w3    (b112.) ;      openchained(paper queue)
     rl. w2     b83.   ;
     jl. w3    (b93.)  ;      open(printer wait)
a12:                   ;    end

     rl. w2     b150.  ;    open (paper manipulation);
     jl. w3    (b93.)  ;
\f


; re 2.12.74                 boss 2, psjobfinis    ...65a...


a7:                    ;    end offline or internal;
     bl  w0  x3+d43    ;
     bs  w0  x3+d98    ;
     ls  w0     12     ;    page 1 + 8:= (mounts - rest mounts) <12 +
     hl  w0  x3+d92    ;    tape count;
     rs  w0  x3+8      ;    comment kind:= finis;
     al  w0     1      ;    page 1 + 4:= 1;
     rl  w1  x3+d14+4  ;    page1+6:=time used; comment is set by release all;
     ds  w1  x3+6      ;
     dl  w1  x3+d23+2  ;
     ds  w1  x3+12     ;
     dl  w1  x3+d23+6  ;
     ds  w1  x3+16     ;    move username
     rl  w1  x3+d20    ;
     rs  w1  x3+18     ;    move project no
     rl. w2    (b96.)  ;
     rl  w0  x3+d0     ;    page 3:= job file page;
     rs  w0  x2+12     ;
     jl. w3    (b60.)  ;    get pages;
     rl  w1  x3+d136   ;    w1:=summa waiting times
     al  w0     0      ;
     wd. w1     b17.   ;    / 60;
     sl  w1     2047   ;    if w1>byte-size then
     al  w1     2047   ;
     ls  w1     12     ;    w1:=byte-size;
     hl  w1  x3+d140   ;    right byte(w1):=no of input lines;
     bz  w0  x3+d88    ;    if online then
     so  w0     1<3    ;      begin
     jl.        a13.   ;      w1:=w1+1;
     al  w1  x1+1      ;
     am.       (b100.+6);    
j0:  rl  w0    +179    ;      w0:=job state;
     so  w0     1<5    ;      if conversational then
     al  w1  x1+1      ;        w1:=w1+1;
a13:                   ;      end;
     rs  w1  x3+20     ;    page1+20:=waiting time, no of inputlines;
     rl. w1    (b96.)  ;
     rl. w0     b91.   ;    page 3:= virt account buf;
     rs  w0  x1+12     ;
     dl. w3     b89.   ;    call outrec account;
     jl. w1    (b95.)  ;
     bz  w0  x3+d14+3  ;    w0:=psjob no;
     bz  w1  x3+d88    ;    w1:=psjob status;
                       ;    if replace then
     rl. w3     b84.   ;      rel entry:=replace rel;
     sz  w1     1<10   ;
     jl.        a15.   ;
     rl. w3     b73.   ;    if accountjob then
     sn  w0     2      ;      rel entry:=accountjob rel;
     jl.        a15.   ;
     so  w1     1<3    ;    if offline then
     am         b85-b86;      rel entry:=offline rel else
     rl. w3     b86.   ;      rel entry:=online rel;
a15: rl. w2     b87.   ;    w2:=virt psjobstart;
     jl.       (b115.) ;    page jump (rel entry);
b154 = j0+1
e.e.                   ;    end j-names; end a-names
\f



; kll 15.3.72                    boss 2, psjobfinis   ...66...

j40: al  w1  x1+d100-12; text on descr rel d100:
j33: ba. w0     j38.   ; text param:
     rs. w0     b104.  ;    save w0;
     dl  w0  x1+14     ;
     ds  w0  x2+0      ;    move x1+12,...x1+18 to
     dl  w0  x1+18     ;    param field;
     ds  w0  x2+4      ;
     rl. w0     b104.  ;
j38=k+1                ;    displacement constant;
     al  w2  x2+8      ;    w2:= w2 + param length;
     jl.        j32.   ;    goto after param action;

j39=k+1                ;    displacement constant
j42: al  w1  x1+6      ; integer on descr rel 20:
j34: ba. w0     j39.   ; integer param:
     al  w2  x2-2      ;    text base:= w2-2;
     rl  w1  x1+14     ;
     jl. w3     c8.    ;    write integer(w1+14);
     al  w2  x2+8      ;    w2:= w2 + param length;
     jl.        j32.   ;    goto after param action;
j44: rl  w3  x1+12     ; integer or text:
     se  w3     0      ;    if first word of text <> 0 then
     jl.        j33.   ;    goto text on descr else
     jl.        j34.   ;    goto integer param;

j46: ba. w0     j39.   ; octal integer and text:
     al  w2  x2-2      ;    text base:= w2-2;
     rl  w1  x1+20     ;
     al  w3     8      ;    radix := 8;
     rs. w3     b8.    ;
     jl. w3     c8.    ;    write integer(x1+20);
     al  w3     10     ;    radix := 10 (normal);
     rs. w3     b8.    ;
     al  w2  x2+8      ;    w2:= w2+param length;
     rl. w1     b100.+2;    restore w1:=desc;
     jl.        j33.   ;    goto text param;

f23:                   ; end of finis page:

\f


; boj 15.11.71                    boss 2, psjobfinis   ...67...


f21:j30:   b.   a50  w.   ;start of finis text page
; j35   no param
; j36   text param on descr rel d100
; j41   text on descr rel 12...18
; j43   integer on descr rel 20
; j45   integer or text on descr rel 12...18
; j47   text on desc rel 12...18 and integer (octal) on desc rel 20

h. j36,a0 w.  j0:  <:replaced by job file: :>, a0=k-j0
h. j35,a1 w.  j1:  <:killed by user :>, a1=k-j1
h. j35,a2 w.  j2:  <:time exceeded :>, a2=k-j2
h. j35,a3 w.  j3:  <::>, a3=k-j3              ;    normal finis
h. j35,a4 w.  j4:  <:job file exhausted:>, a4=k-j4
h. j35,a5 w.  j5:  <:job file unreadable:>, a5=k-j5
h. j35,a6 w.  j6:  <:killed by operator:>, a6=k-j6
h. j45,a7 w.  j7:  <:mode unknown:>, a7=k-j7
h. j35,a8 w.  j8:  <:output exceeded:>, a8=k-j8
h. j43,a9 w.  j9:  <:not special station: :>, a9=k-j9
h. j43,a10 w. j10: <:special station not ordered: :>, a10=k-j10
h. j41,a11 w. j11: <:ring not allowed on tape: :>, a11=k-j11
h. j41,a12 w. j12: <:tape reserved for other project: :>, a12=k-j12
h. j41,a13 w. j13: <:stations exceeded at mount :>, a13=k-j13
h. j35,a14 w. j14: <:suspends exceeded:>, a14=k-j14
h. j35,a15 w. j15: <:login claims exceeded:>, a15=k-j15     ;    
h. j41,a16 w. j16: <:tape used by other job: :>, a16=k-j16
h. j35,a17 w. j17: <:accounts exceeded:>, a17=k-j17
h. j35,a18 w. j18: <:convert file unreadable:>, a18=k-j18
h. j35,a19 w. j19: <:max waiting time exceeded:>, a19=k-j19
h. j35,a20 w. j20: <:bad fp:>, a20=k-j20
h. j35,a21 w. j21: <:size too small for fp:>, a21=k-j21
h. j35,a22 w. j22: <:no interrupt address:>, a22=k-j22
h. j41,a23 w. j23: <:mount special after mount :>,a23=k-j23
h. j35,a24 w. j24: <:corelock not allowed:>, a24=k-j24
h. j35,a25 w. j25: <:corelock exceeded:>, a25=k-j25
h. j41,a26 w. j26: <:load area in use :>, a26=k-j26
h. j47,a27 w. j27: <:hard error on initial program or swop area, octal status = :>, a27=k-j27        
h. j45,a28 w. j28: <:too few resources on :>, a28=k-j28
h. j35,a29 w. j29: <:job name conflict:>, a29=k-j29
h. j45,a30 w. j60: <:program does not exist :>, a30=k-j60
h. j35,a31 w. j61: <:size too small:>, a31=k-j61
h. j35,a32 w. j62: <:temp exceeded:>, a32=k-j62
h. j36,a33 w. j63: <:replace file unreadable :>, a33=k-j63
h. j36,a34 w. j64: <:replace file too long :>, a34=k-j64
h. j35,a35 w. j65: <:temp exceeded job file:>, a35=k-j65
h. j35,a36 w. j66: <:card deck exhausted:>, a36=k-j66
h. j45,a37 w. j67: <:limited :>, a37=k-j67
h. j45,a38 w. j68: <:option unknown :>, a38=k-j68
h. j45,a39 w. j69: <:param at :>, a39=k-j69
h. j45,a40 w. j70: <:syntax at :>, a40=k-j70
h. j45,a41 w. j71: <:line too long after :>, a41=k-j71
h. j45,a42 w. j72: <:device unknown :>, a42=k-j72
h. j47,a43 w. j73: <:hard error on convert file or temporary copy, octal status = :>,a43=k-j73
h. j35,a44 w. j74: <:job creation impossible:>, a44=k-j74
h. j35,a45 w. j75: <:file is no text file:>, a45=k-j75
e.                     ; a-names
h.  j80=k-j30
     j0-j30, j1-j30, j2-j30, j3-j30, j4-j30, j5-j30, j6-j30, j7-j30
     j8-j30, j9-j30, j10-j30,j11-j30,j12-j30,j13-j30,j14-j30,j15-j30
     j16-j30,j17-j30,j18-j30,j19-j30,j20-j30,j21-j30,j22-j30,j23-j30
     j24-j30,j25-j30,j26-j30,j27-j30,j28-j30,j29-j30
     j60-j30,j61-j30,j62-j30,j63-j30,j64-j30,j65-j30,j66-j30,j67-j30
     j68-j30,j69-j30,j70-j30,j71-j30,j72-j30,j73-j30,j74-j30,j75-j30

w.
j35=j32-j32,j36=j40-j32,j41=j33-j32,j43=j42-j32,j45=j44-j32,j47=j46-j32
f22=k-f21              ; length of page
e.                     ; end j-names
\f


; boj 15.11.71                    boss 2, psjobfinis   ...68...


b. a9 w.
c24:                   ;    start of init;
; initialization
; reserve virtual
     al  w1     f24    ;    w1:= length of break page;
     al  w0     i28    ;    w0:= drum (0) or disc (1);
     jl. w3    (f11.)  ;    reserve virtual(w0, w1) virt ref page 0:=w2;
     rs. w2     f16.   ;    save virt ref break

     rl. w1     a1.    ;    w1:=length finis page
     al  w0     i28    ;    
     jl. w3    (f11.)  ;    reserve virt(finis page)
     rs. w2     a2.    ;    save virt of finis page
     am        -2047   ;
     am        -2000   ;
     rs. w2     b38.+4047;  and on break page;

     al  w0     i28    ;    disc
     al  w1     f20    ;    length of clean catalog page
     jl. w3    (f11.)  ;    reserve virt;
     am        -2047   ;
     al. w0     f19.+2047;  start 
     jl. w3    (f13.)  ;    move to virt;
     am        -2047   ;
     rs. w2     b24.+2047;  save virt of clean catalog
     rs. w2     a3.    ;    on finis page;

     al  w0     i28    ;    disc
     al  w1     f22    ;    length of finis text page; 
     jl. w3    (f11.)  ;    reserve virt;
     al. w0     f21.   ;    start
     jl. w3    (f13.)  ;    move to virt;
     am        -2047   ;
     rs. w2     b107.+2047; save virt on finis page;

; initialize page constants
     rl  w1     66     ;
     rl  w1  x1+76     ;    boss private base
     al  w1  x1+1      ;    on finispage:=
     al  w0  x1        ;    boss std low+1;
     am        -2047   ;
     ds. w1     b117.+2047;

\f


; kll 12 03 73                    boss 2, psjob finis   ...69...


; initialize externals
     al  w0     c20-f19;

     am        -2047   ;
     rs. w0     b25.+2047;
     al  w0     c2-b100;
     am        -2047
     am        -2000   ;
     rs. w0     b39.+4047

     jl. w3    (2)     ;    set externals;
f25:            40     ;

a3:      0  ,   495    ;    virt ref clean catalog;
a2:      0  ,   417    ;    virt ref finis page;
f16:     0  ,   426    ;    virt ref break page;
     c2-b100,   427    ;    finis(finiscause);
     c0-b0  ,   353    ;    receive timer operation;
     c7-b0  ,   352    ;    terminate;
     c9-b0  ,   355    ;    break request;
    c10-b0  ,   357    ;    timer request;
    c12-b0  ,   351    ;    user kill;
    c13-b100,   354    ;    finis request;
    c14-b0  ,   356    ;    replace request;
    c15-b0  ,   358    ;    input exhausted;
    c16-b0  ,   359    ;    hard error primary input;
    c17-b100,   360    ;    end medium prim output;
    c18-b0  ,   361    ;    mount error;
    c46-b0  ,   362    ;    swop out and wait;
    c20-f19 ,   363    ;    clean catalog;
     c4-b0  ,   481    ;    corelock request;
    c11-b0  ,   482    ;    coreopen request;
    c38-b0  ,   493    ;    high priority start;
c. e25-1
     c5-b100,   478    ;    return from mounter finis;
z.
         0  ,  -1000   ;    end of externals;


\f


; kll  12 03 73                  boss 2, psjob finis   ...70...



; move to virtual  w1 = length of code, w2 = virt ref page 0;
     rl. w1     a5.    ;
a4:  al. w0  x1+0      ;    w0:= abs ref breakpage;
     rl. w2     f16.   ;    w2:=virt ref breakpage
     al  w1     f24    ;    w1:=length breakpage
     jl. w3    (f13.)  ;    move to virtual
     am        -2047   ;
     al.  w0     b100.+2047;
     rl. w2     a2.    ;    virt finis
     rl. w1     a1.    ;    w1:= length of finis page;
     jl. w3    (f13.)  ;    move finispage to virtual
am.(4),jl.4,h1.        ;    goto next init

; variables used by initialisation
a1:       f23-b100     ;    length of finis page
a5:       b0-a4        ;    rel start of breakpage;

f11:      12           ;    ref reserve virtual
f12:      0            ;    ref externals
f13:      13           ;    ref move to virtuals
f14:      15           ;    ref end initialization
e.     ; end a-names

e.     ; end d-names
i.e.   ; end b-names, c-names, f-names
h4=s0, h5=s1; final check sums
e.e.e. ; end hnames, options   , tjob
\f

▶EOF◀