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

⟦154ef9ea9⟧ TextFile

    Length: 115968 (0x1c500)
    Types: TextFile
    Names: »central«

Derivation

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

TextFile

(bos = set 8 disc
bos = slang proc.options
bos = entry bos bos 0 0 0 8.12 bos
scope user bos
print bos integer words.4 4.10
)
\f



; rc 18.2.71          contents          central   ...1...

; Content of central logic and use of key variables in the coroutine
; description:
;
;                       chain      state       page2    d-name   page
;
; send and wait         answer     bufferaddr  0           d0    9
; send and wait fast    answer     bufferaddr  coretabref  d1    9
; send and wait slow    answer     bufferaddr  coretabref  d2    9
; stop and wait         answer     bufferaddr  0           d26   9
; lock                  sem        0           unch        d3    10
;       or              pagerque   semaddr     unch       
; open                  unch       unch        unch        d4    12
; lock chained          sem        0           unch        d5    10
;       or              pagerque   semaddr     virt op    
; open chained          pagerque   virt op     last virtop d6    11
; getpages              pagerque   0           unch        d7    13
; page jump             pagerque   0           unch        d8    13

; put inchain                                              d9    13
; get from chain                                           d10   13
; put in activ chain                                       d11   13
; wait                                                     d12   14
; exit from pager                                          d13   14
; clear core                                               d14   13
; alarm                                                    d15    3
; start of init                                            d16   31 
; call                                                     d17   13
; pagerbuf free                                            d20   26
; coruno output                                            d21    4
; entry pager                                              d23   20
; page 0 of pager                                          d24   20    
; lock after checkpages                                    c1    10
; open chained after checkpages                            c2    11
; first event                                              c3    14
; next event                                               c4    14
; checkpages                                               c5    14
; exit to coruno                                           c7    15
; answer received                                          c8    15
; message received                                         c9    16
; page missing                                             c10   14
; check one page                                           c11   17
;
;
; During open chained the chain of the operation containes the 
; semaphor address;
\f




b.  w.
p.<:fpnames:>
p.1
; sl 3.7.72          break          central   ...2...

h99 = 0 ; count k-assignments
c.e7 , k = h55 , h99 = h99 + 4 z.
s0=0, s1=1             ;    clear checksums
s. d40, f70  w.        ; block for central logic, pager and init
f0:  0,0               ; abs f0 (for dump), max request free
     f48, f49          ; request free addr(for performon), checksums
78 08 07, 72           ; version id:
     al. w3     f0.    ;+12 entry from fp or s:
     am.      (+4)     ;    w3:= boss core base;
     jl.       +2      ;    goto start of init;
     d16.              ;+18 words also used for saved registers;
b. c30 w.              ; block for central logic
m.          boss 2  central

; break routine, alarm
b. a10, b10  w.        ;
b6=f0+6                ;    interrupt addr;
c.e56-k+b6-1
     jl. 2, r.(:e56-k+2+b6:)>1;    extend register dump area to e56 bytes;
z.
     al. w1     b6.    ;   w1:=interrupt addr;
     dl. w3     b6.+12 ;   w3:= cause; w2:= ic
     rl. w0     b1.    ;  
     ws  w0  x2-2      ;   w0:= jd-1 - instruction;
     sn  w3     0      ;   if cause = 0
     se  w0     0      ;   and instruction = jd-1 then
     jl.        a1.    ;   begin
     al  w0     14<6+8 ;     w0:= 14 bytes, kind 8
     rl. w2     f1.    ;     w2:= corutine;
     bl  w3  x2+4      ;     if testmode 1 then
     sz  w3     1      ;
     jl. w3     d21.   ;     call coruno output
     dl. w1     b6.+2  ;     reestablish all registers
     dl. w3     b6.+6  ;     return
     xl.        b6.+9  ;
c.-e80
     jl.       (b6.+10);    rc4000 return
z.
c. e80
     je.       (b6.+10);    rc8000 return
z.

a1:  sh  w0     199    ;
     sh  w0     0      ;   if not jd-199 to jd-1 then
     al  w0     0      ;   w0:= 1;
     ba. w0     1      ;
     se  w0     1      ;   left byte(w3) :=
     ac  w3    (0)     ;     if cause is jd-2 to jd-199 then
     ls  w3     12     ;       bossfault number else interrupt cause;
     rl. w2     f2.    ;   w2:=abs corunocode;
     hl  w3  x2+10     ;   right byte(w3):=page ident;
     rs. w3     b6.+12 ;   save fault cause, page ident;
     ls  w2     2      ;
     wa. w2     b6.+8  ;
     rs. w2     b6.+8  ;   save corunocode together with exception reg.
     al. w2     b7.    ;
a2:  al  w3     0      ;   convert fault cause
     wd. w0     b8.    ;
     al  w3  x3+48     ;   for alarm text;
     rs  w3  x2        ;
     al  w2  x2-2      ;
     se  w0     0      ;
     jl.        a2.    ;
c. i205
     rl. w1     b6.+10 ;    w1:=interrupt addr.
     sh. w1    (f7.)   ;    if interrupt addr inside boss core then
     sh. w1     f0.    ;
     jl.        a5.    ;    begin
     al  w1  x1-i205+2 ;      w1:=first addr of test code;
     al  w0     i205<6+22;    w0:=no of bytes, kind=22;
     jl. w3     d21.   ;      call coruno output;
a5:  al. w1     b6.    ;    end;
z.
     al  w0     14<6+9 ;   w0:= 14 bytes, kind 9
     jl. w3     d21.   ;   call coruno output
     jl. w2     c24.   ;   call outblock
     rl. w0     f36.   ;   if kind of test medium <> bs then
     sn  w0     4      ;   begin
     jl.        a3.    ;
     al  w0     10     ;      change operation to outmark;
     hs. w0     f31.   ;      call outblock;
     jl. w2     c24.   ;   end;
a3:

\f


; kll 3.4.73          break         central   ...2a...


c.e7                   ;  if fp mode then
     al  w2     12     ;
     jl. w3     h33.-2 ;      (outend(ff); goto wait);
z.                     ;    
     al. w1     b2.    ;
     jl. w3     c26.   ;   output main console(boss fault);
     rl. w0     b6.    ;
     jd         1<11+28;    print content of w0 on main console;
     jl.        0      ;   endless loop;
d25:
c26: al  w2  x1+16     ; output main console:  always 18 bytes text.
     ds. w2     b4.    ;   set first and last address;
     rs. w3     b3.    ;   save return;
a4:  al. w1     b5.    ;
     al. w3     f16.   ;
     jd         1<11+10;    (w3=main console) release process;
     jd      1<11+16   ;   send message to main console;
     al. w1     c27.   ;
     jd      1<11+18   ;   wait answer;
     bl  w1  x1        ;   if attention status then
     sz  w1     1<4    ;     repeat;
     jl.        a4.    ;
     jl.       (b3.)   ;   return;

b1:  jd         -1     ;
b2:  <:<10>***boss fault :>; alarm text
b0:
b7=k+4,  0,  0, 0, 10  ;   remaining part of text
b8:  10                ;
b3:  0                 ;   return
b5:  5<12              ; output to main console
     0                 ; first address
b4:  0                 ; last address
e.
\f





; kll 3.4.73        testoutput        central   ...3...




; test output from central logic
b. a10, b10 w.         ;
c12: dl. w2     f46.   ; test send:   w1:= mess addr
     rl  w2  x2+8      ;    w2:= name table addr;
     al  w0     8<6+1  ;   w0:= 8 bytes, kind 1
     jl.        c20.   ;   goto w2 output

c13: rs. w1     b1.    ; test lock:   w2 = semaphor; save w1
     am         2-4    ;   w0:=2 bytes, kind 2
c15:                   ; test open:
     al  w0     2<6+4  ;   w0:=2 bytes, kind 4
     al  w1  x2        ;   w1:=addr of sem. value
     jl.        c20.   ;   goto w2 output

c14: rl. w1     f10.   ; test opench:   w1:= operation addr, w2 = semaphor
     al  w0     8<6+3  ;   w0:= 8 bytes, kind 3
     jl.        c20.   ;   goto w2 output

c16: ds. w1     b1.    ; test exit:   save w0, w1; w2 = coruno
     al  w0  x2+6      ;   w0:= page descr addr;
c.e8,rl. w0     f2.    ;   if abs mode then w0:= page 0 abs;
z.   bz  w2  x2+4      ;    w2:= corutine ident;
     ls  w2    -3      ;
     rs. w0     b5.    ;   page list addr := w0;
     al  w0  18<6+5    ;   w0:= 18 bytes, kind 5;
     jl. w3     c20.   ;   call w2 output;
     rl. w2     f1.    ;   w2:= coruno;
     jl.        c17.   ;   goto end test;

c18: rs. w1     b1.    ; test mess:   save w1
     am.       (f10.)  ;
     rl  w1     +8     ;   w1:= mess buf addr(sender table index)
     al  w1  x1+6      ;   w1:= addr of sender and operation
     al  w0     8<6+6  ;   w0:= 8 bytes, kind 6
     jl.        d21.   ;   goto coruno output

c19: rs. w1     b1.    ; test answ:   save w1
     rl  w1  x1+2      ;
     al  w1  x1+4      ;    w1:= ref result in answer;
     al  w0     2<6+7  ;   w0:= 0 bytes, kind 7
     jl.        d21.   ;   goto coruno output
\f


; rc 1.3.71          testoutput          central   ...4...


; procedure w2 output:   w0 = length < 6 + kind, w1 = address of words
; to output, w2 = first word to output. return: w2 unchanged,
; w3 = abs page 1, w0 - w1 reestablished by means of save cells.

d37:
c20: ds. w3     b3.    ; w2 output:   save w2 - 3
a1:  rs. w2     b4.    ;   first word:= w2
     rs. w0     b7.    ;   save length, kind
     ls  w0    -6      ;
     wa. w0     f38.   ;   w0:= length + current test addr;
     am.       (f33.)  ;
     sl  w0    -2      ;   if w0+2 >= last addr then
     jl. w2     c24.   ;   outblock; only w1 saved.
     rl. w0     b7.    ;   w0:= saved length, kind;
     sn  w0     18<6+5 ;    if test exit then
     al  w0     16<6+5 ;    length:= 16, kind:= 5...;
     rx. w0     b7.    ;
     jl. w3     c23.   ;   outkind; w1 saved.

     al  w3     0      ;
     rl  w0     106    ;     w3, w0:= microsec + time
     aa  w0     110    ;
     ss. w0     f39.   ;      w3,w0:= (time-start time) mod 2**29;
     la. w3     b8.    ;
     wd. w0     b6.    ;      w0:=time:=w3,w0 // 100;
     jl. w3     c22.   ;     outword(time)
     rl. w0     b4.    ;
     jl. w3     c22.   ;   outword(first word);

a3:  rl. w2     b7.    ; rep:  w1=addr of word to output.
     al  w2  x2-2<6    ;   decrease length by 2;
     rs. w2     b7.    ;
     sn  w2     8<6+5  ;   if test exit and length=8 then
     rl. w1     b5.    ;   w1:= page list addr;
     rl  w0  x1        ;   w0:= word to output;
     al  w1  x1+2      ;   w1:= next;
     al. w3     a3.    ;   prepare return to rep;
     sl  w2     0      ;   if length >= 0 then
     jl.        c22.   ;   outword(word) return to rep
     am.       (f1.)   ;    if test exit then
     bz  w0    +5      ;
     am.       (f2.)   ;
     bz  w1    +10     ;   w1:=page ident;
     hs  w1     0      ;   w0:=page ident, rel exit;
     sn  w2    -2<6+5  ;    outword(page ident, relative exit);
     jl. w3     c22.   ;

     dl. w1     b1.    ;   reestablish w0, w1, w2
     rl. w2     b2.    ;
     am.       (f2.)   ;
     rl  w3    +2      ;    w3:= abs page 1;
     jl.       (b3.)   ;   return

\f


; kll 3.4.73         testoutput        central   ...4a...



; procedure coruno output:   w0 = length < 6 + kind, w1 = address of
; words to output. return: as w2 output. w3=page 1 abs, w2 unchanged.

d21: ds. w3     b3.    ; coruno output:   save w2 - 3
     rl. w2     f1.    ;
     bz  w2  x2+4      ;    w2:= corutine ident;
     ls  w2    -3      ;
     jl.        a1.    ;   goto w2 output

b1=  k+2, 0, 0         ;   saved w0, w1
b2:  0                 ;   saved w2
b3:  0                 ;   saved w3
b4:  0                 ;   first word
b5:  0                 ;   page list addr
b6:  100               ;
b7:  0                 ;   saved length, kind
b8:  31                ;   mask
e.                     ; end test output
\f


; rc 3.3.71          testoutput          central   ...5...


; outword and outblock
b. a10, b30 w.         ;
c23: c.e7              ; outkind:   w1 saved, w0 = word to output
     ds. w1     b1.    ;   if fp mode then begin
     rs. w3     b3.    ;
     rl. w0     f1.    ;   w0:= old corutine;
     rx. w0     b9.    ;   old corutine := corutine;
     al  w2     10     ;   prepare outnl;
     se. w0    (b9.)   ;   if w0 <> corutine then
     jl. w3     h26.-2 ;   fp outchar on current output;
     rl. w0    b19.    ;
     ls  w0     18     ;   w0:= saved length, kind;
     ls  w0    -16     ;   w0:= min(2*kind,2*10);
     sl  w0     11<2   ;
     al  w0     10<2   ;
     am        (0)     ;   w0:= text addr(w0)
     al. w0     b2.    ;
     jl. w3     h31.-2 ;   fp outtext on current output
     dl. w1     b1.    ;   reestablish w0, w1, w3
     rl. w3     b3.    ;
     jl.        a1.    ;
b19:
b1=  k+2, 0, 0         ;   saved w0, w1, w3. only in fp mode
b3:  0                 ;
b2=  k-4, <:<10>send<0>:>, <:<10>lock<0>:>, <:<10>opch<0>:>
          <:<10>open<0>:>, <:<10>exit<0>:>, <:<10>mess<0>:>
          <:<10>answ<0>:>, <:<10>jd-1<0>:>, <:<10>stop<0>:>
          <:<10>priv<0>:>
b9:       0            ;    old corutine
z.                     ;   end fp mode
c22: c.e7              ; outword:   w1 saved, w0 = word to output
     ds. w1     b1.    ;   if fp mode then begin
     rs. w3     b3.    ;   save w0, w1, w3
     jl. w3     h32.-2 ;   fp outinteger on current output
     1<23 + 32<12 + 8  ;   8 positions
     dl. w1     b1.    ;
     rl. w3     b3.    ;   reestablish w0, w1, w3
z.                     ;   end fp mode
a1:  rx. w1     f38.   ;   save w1, w1:= current addr
     rs  w0  x1        ;   store word in buffer
     al  w1  x1+2      ;   current addr := next;
     rx. w1     f38.   ;   get saved w1
     jl      x3        ;   return

a2:  rs. w3     b4.    ; send op:   save return
     al. w3     f35.   ;   w3:= test document
     jd         1<11+16;   send message
     bz  w3  x1        ;    w3:= operation;
     al. w1     b5.    ;   
     jd         1<11+18;   wait answer
     rl. w1     b5.    ;   w1:= status in answer
     se  w0     1      ;    if result = normal or
     sn  w3     8      ;    operation = unload then
     jl.       (b4.)   ;    goto return else
     jl.        a3.    ;    goto inactivate;
\f


; rc 3.3.71          testoutput          central   ...6...
d36:


c24: ds. w2     b7.    ; outblock:  save w1, return;
     al  w0     0      ;   buf(current addr):=0;
     rs. w0    (f38.)  ;   may use a word outside buffer.
     rs. w0     b8.    ;   parity count:= 0
     se. w0    (f37.)  ;   if activate <>0 then
     jl.        a4.    ;   goto exit

a6:  al. w1     f31.   ; send:
     jl. w3     a2.    ;   send op(output block), w1 = status
     rl. w0     f36.   ;   
     se  w0     4      ;   if kind = bs then
     jl.        a5.    ;   begin
     sz. w1    (b10.)  ;     if status = hard then
     jl.        a3.    ;     goto inactivate
     rl. w0     f34.   ;
     ba. w0     1      ;     segment count:= segment count + 1
     rs. w0     f34.   ; 
     sn  w1     0      ;     if status = 0 then
     jl.        a4.    ;     goto exit
     rl. w0     f47.   ;     segment count:= cycle start
     rs. w0     f34.   ;     goto send
     jl.        a6.    ;   end;
a5:  
c. e6
     sz. w1    (b17.)  ;    if end of tape then
     jl.        a7.    ;    goto end of tape;
z.

     sz. w1    (b11.)  ;   if status = hard then
     jl.        a3.    ;   goto inactivate
     so. w1    (b12.)  ;   if status <> parity then
     jl.        a4.    ;   goto exit
     rl. w0     b8.    ;
     ba. w0     1      ;   parity count:= parity count + 1
     rs. w0     b8.    ;
     sl  w0     6      ;   if parity count >= 6 then
     jl.        a3.    ;   goto inactivate
     al. w1     b13.   ;
     jl. w3     a2.    ;   send op(backup block)
     al. w1     b14.   ;  
     jl. w3     a2.    ;   send op(erase)
     jl.        a6.    ;   goto send

a3:  
     jd         1<11+30;    testoutput of status;

     al. w1     b15.   ; inactivate:
     jl. w3     c26.   ;   output main console(inactive);
     rs. w2     f37.   ;   activate := <>0;
a4:  rl. w1     b6.    ; exit:  w1:= saved w1;
     rl. w2     f32.   ;
     rs. w2     f38.   ;   current addr := first addr;
     jl.       (b7.)   ;   return
\f


; rc 3.3.71          testoutput          central   ...7...


c. e6
a7:  al. w1     b18.   ; end of tape:
     jl. w3     a2.    ;    sendop(output mark);
     sz. w1    (b12.)  ;
     jl.        a7.    ;    if parity then goto end of tape;
     al. w1     b20.   ;
     jl. w3     a2.    ;    send op(unload tape);
     al. w1     b19.   ;
     jl. w3     c26.   ;    output main console(change testoutput tape);
     rl. w2    (f51.)  ;    w2:= process descr addr for test medium;
a8:  rl  w0  x2+22     ; rep:
     se  w0     2      ;    if state <> remote pressed then
     jl.        a8.    ;    goto rep;

     am        (66)    ;
     dl  w1    +74     ;
     al. w3     b21.   ;    set catalog base to boss max interval;
     jd         1<11+72;

     rl  w1  x2+10     ;
     ls  w1    -6      ;    w1:= device number(w2);
     al. w3     f35.   ;
     jd         1<11+54;    create peripheral process(bosstest);
     se  w0     0      ;    if not ok then
     jl.        a3.    ;    goto inactivate;
     jd         1<11+6 ;    initialize process;
     se  w0     0      ;    if not ok then
     jl.        a3.    ;    goto inactivate;

     al. w1     b22.   ;    
     jl. w3     a2.    ;    send op(rewind tape);
     jl.        a4.    ;    goto exit;
z.


b4:  0                 ;   return from sendop
c27:                   ;   also used by output main console
b5:  0, r.8            ;   answer
b6:  0                 ;   save w1 in outblock
b7:  0                 ;   save w2 in outblock
b8:  0                 ;   parity count
b10: -1-1<18           ;   hard error mask, bs: all except end document
b11: -1-1<23-1<22-1<15-1<14-1<16;   hard error mt: all except intervention, parity,
                       ;   write enable, high density, tape mark
b12: 1<22              ;   mask for parity error
b13: 8<12              ;   move operation, backup block
     3                 ;
b14: 6<12              ;   erase operation
b15: <:<10>*** test output inactive<10>:>
b16= k-2               ;
c. e6
b17: 1<18              ;    end of tape
b18: 10<12             ;    output mark
b19: <:<10>***change testoutput tape<10>:>
b20:  8<12, 5          ;    unload tape
b21: 0                 ;    used by set cat base
b22:  8<12, 4          ;    rewind tape
z.
e.                     ;
\f


; rc 7.12.71          variables          central   ...8...


f1:     e9 a. 1        ; coruno
f2=f1+2,          0    ; corunocode
f3=k-2,f13=f3+2,0,0    ; answer
f4=k-2,f14=f4+2,0,0    ; activ
f5:    -1,0,0          ; pagerqueue
f6:     0              ; waiting for buffer
f7:     0              ; max core  (virt(z)=>max core place)
f8:     6              ; current priority
f9:     0              ; last real entry of coretable
f10:    0, r.9         ; work (used by wait answer)
f11:    1              ; writing
f16:    0, r.5         ; name of main console
f20:    0              ; coruno table start (pager)
f21:    0              ; first of core table
f22:    0              ; postrecord in of sendertable
f23:    0              ; first core place
f24:    1<23           ; segmenttable base
;f25    see pager
f26: <:drumcore:>,0,0  ; drum name
f27: <:disccore:>,0,0  ; disc name
f28:    0              ; first drum segment
f29:    0              ; number of drum segments
;f30                   ; length of central logic
f31:    5<12           ; test output operation:
f32:    0              ; 
f33:    0              ;
f34:    0              ;
f35:    <:bosstest:>,0,0; name of test medium
f51=k-2                ; name table addr of test medium
f36:    0              ; kind of test medium
f37:    0              ; test output activ
f38:    0              ; current test addr
f39=k+2,0,0            ; boss start time
;f40                   ; length of resident part init
f41:      0            ; core table length
f42:      0            ; search limit
f43:      0            ;    for set base
f44=k+2,  0, 0         ;    work for prep term access
f45:      0            ;    base file access table
f46=f10+2              ; for addressing in test output
f47:      0            ; cycle start (test output on bs)
;f48, f49 slang checksums
\f


; rc 18.2.71          send and wait          central   ...9...


b. a2 w.               ; send and wait:
; w1=mess, w2=name, w3=return;
d0:  ds. w2     f10.+2 ;   save w1,w2;
     al  w2     0      ;   w2:= 0;
     jl.        a1.    ;   goto send;
; send and wait virtual:
d1:  am         1<8-1<9; fast:
d2:  al  w0     1<9    ; slow:
     ds. w2     f10.+2 ;   save w1,w2
     rl  w2  x1+2      ;
     ws. w2     f23.   ;   w2:= first addr of mess-first core place;
     ls  w2     -9     ;
     ls  w2     2      ;   w2:= 4*core index + core table base;
     wa. w2     f21.   ;
     bz  w2  x2+3      ;   w2:= first segment in page;
     am.       (f24.)  ;
     bz  w2  x2        ;   w2:= segment table(first segment in page);
     wa. w2     f21.   ;   w2:= core table address for first segm in page;
     wa  w0  x2+1      ;
     rs  w0  x2+1      ;   coretab(w2):= coretab(w2)+bufferbit(fast or slow);
a1:  rl. w1     f1.    ; send:    w1:= coruno;
     rs  w2  x1+10     ;   page2(coruno):= w2;
     ws. w3     f2.    ;
     hs  w3  x1+5      ;   relreturn:= w3-coruno code;
     al. w2     f3.    ;
     jl. w3     d9.    ;   put in chain(coruno,answer);
     rl. w1     f10.   ;   w1:= message addr;
     rl. w3     f10.+2 ;   w3:= name addr;
     jd         1<11+16;   send message;
a2:  sh  w2     0      ; after send:
c. -1, o6, z.          ;   (bossfault xref)
     jd        -6      ;   if claim exceeded then goto alarm;
     rl. w1     f1.    ;   w1:= coruno;
     rs  w2  x1+2      ;   state(coruno):= mess buf addr;
     bz  w0  x1+4      ;
     sz  w0     1      ;   if test(coruno) = central test then
     jl. w3     c12.   ;   test send;
     jl.        d12.   ;   goto wait;

d26: rl. w1     f1.    ; stop and wait:  w1:=coruno;
     ds. w2     f10.+2 ;    save process name addr; f10:=beware of testoutput;
     al  w2     0      ;
     rs  w2  x1+10     ;   page 2(coruno):= 0;
     ws. w3     f2.    ;
     hs  w3  x1+5      ;   rel return:= w3 - coruno code;
     al. w2     f3.    ;
     jl. w3     d9.    ;   put in chain(coruno, answer);
     rl. w3     f10.+2 ;   w3:= process name;
     jd         1<11+60;   stop process;
     jl.        a2.    ;   goto after send;

d35: rl. w1     f1.    ; wait answer:   w1:= coruno;
     ws. w3     f2.    ;    used in transmit.
     hs  w3  x1+5      ;    rel return:= w3 - coruno code;
     sh  w2     0      ;    if claim exceeded then
c. -1, o6, z.          ;   (bossfault xref)
     jd        -6      ;     alarm;
     rs  w2  x1+2      ;    state(coruno):=mess buf addr;
     al. w2     f3.    ;
     jl. w3     d9.    ;    put in chain(coruno, answer);
     jl.        d12.   ;    goto wait;
e.
\f


; rc 18.2.71          lock          central   ...10...


b. a5 w.               ; lock: lockchained:
; w2=semaphor addr, w3= return;
d3:
d5:  rl. w1     f1.    ;   w1:= coruno;
     ws. w3     f2.    ;
     hs  w3  x1+5      ;   relreturn:= w3-coruno code;
     bz  w0  x1+4      ;
     sz  w0     1      ;   if test(coruno) = central test then
     jl. w3     c13.   ;   test lock;
     rl  w3  x2        ;   w3:=semaphor;
     sl  w3     1      ;   if semaphor < 1 then
     jl.        a1.    ;   begin
     al  w3  x3-1      ;
a2:  rs  w3  x2        ;     semaphor:= semaphor-1;
     al  w0     0      ;     state(coruno):= 0;
     rs  w0  x1+2      ;     put in chain(coruno,semaphor);
     jl. w3     d9.    ;     goto wait;
     jl.        d12.   ;   end;
a1:  rl  w3  x2+2      ;
     se  w3     0      ;   if first(sem) <>0 then
     rs  w3  x1+10     ;      page 2(coruno):= first(sem);
     rs  w2  x1+2      ;   state(coruno):= semaphor addr;
     jl.        c5.    ;   goto check pages;
; lock after check pages:
; w1=coruno
c1:  rl  w2  x1+2      ;   w2:= semaphor addr;
     rl  w3  x2        ;   w3:= semaphor-1;
     al  w3  x3-1      ;   if semaphor < 1 then
     sh  w3    -1      ;    goto wait for the semaphore;
     jl.        a2.    ;
     rs  w3  x1        ; (test output of semaphore value);
     rl  w0  x2+2      ;   if first(sem)= 0 then
     se  w0     0      ;   begin comment unchained;
     jl.        a3.    ;     semaphor:= semaphor-1;
     rs  w3  x2        ;     goto exit to coruno;
     jl.        c7.    ;   end else
a3:  se  w0 (x1+10)    ;   if page 2(coruno) = first(sem) then
     jl.        a4.    ;   begin comment chained;
     rs  w3  x2        ;     semaphor:=semaphor-1;
     rl. w1     f2.    ;    (test output of semaphore value);
     rl  w1  x1+4      ;
     rl  w3  x1        ;
     rs  w3  x2+2      ;
     jl.        c7.    ;   end else
a4:  rs  w0  x1+10     ;   begin comment snatched away under its very nose;
     jl.        c5.    ;     page 2(coruno):= first(sem);
                       ;     goto check pages;
e.                     ;   end;
\f


; rc 18.2.71          open          central   ...11...


b. a1 w. ; open chained:
; w1=operation, w2= semaphor addr, w3=return;
d6:  rl  w0  x2        ;   chain(operation):=semaphor value
     rs  w0  x1        ;   (for testoutput)
     rs. w1     f10.   ;   save operation;
     rl. w1     f1.    ;  
     ws. w3     f2.    ;
     hs  w3  x1+5      ;   relreturn:= w3 - coruno code;
     bz  w1  x1+4      ;
     sz  w1     1      ;   if test(coruno) = central test then
     jl. w3     c14.   ;   test open chained;
     rs. w2     (f10.) ;   chain(operation):=semaphore addr;
     rl. w0     f10.   ;
     ws. w0     f23.   ;   w0:= operation addr - first core place;

     ld  w1     -9     ;   w3:= core index;
     rl  w3     0      ;
     ls  w3     2      ;   w3:= 4*core index;
     am.       (f21.)  ;   w0:= segment no:= core index
     ba  w0  x3+0      ;   - core index for first + segment no for first;
     ld  w1     +9     ;   w0:= virtual operation;
     rl. w1     f1.    ;   w1:= coruno;
     lo. w0     f11.   ;
     rs  w0  x1+2      ;   state(coruno):= virtual operation + writing;
     rl  w0  x2+4      ;
     rs  w0  x1+10     ;   page 2(coruno):= last(sem);
     jl.        c5.    ;   goto checkpages;

; open chained after check pages:
; w0=state, w1=coruno, w2=corunocode;
c2:  jl. w3     c11.   ;   check one page(state);
     rl  w3     0      ;   w3:= abs operation;
     rl  w2  x3        ;   w2:= semaphor addr;
     rl  w0  x2        ;   w0:= semaphor+1;
     ba. w0     1      ;   
     sl  w0      1     ;   if sem<0 then
     jl.        a1.    ;   begin comment activate;
     rs  w0  x2        ;     sem:= sem+1;
     jl. w3     d10.   ;     get from chain(w1:=first in que,sem);
     jl. w3     d11.   ;     put in chain(first in que,activ);
     am.       (f1.)   ;
     rl  w0     +2     ;     page 2(first in que):= state(coruno);
     rs  w0  x1+10     ;     comment virtual operation;
     rl. w1     f1.    ;     w1:= coruno;
     al  w0     0      ;
     rs  w0  x1+2      ;     state(coruno):= page 2(coruno):=0;
     rs  w0  x1+10     ;
;     page 2 abs not cleared. will appear in test output from exit.
     jl.        c7.    ;     goto exit to coruno;
a1:
e.
\f


; rc 18.2.71          open          central   ...12...


b. a3 w.               ;
     rl  w2  x2+4      ;   end else
     se  w2 (x1+10)    ;   if last(sem)= page 2(coruno) then
     jl.        a3.    ;   begin
     al  w2     0      ;     chain(operation):= page 2(coruno):= 0;
     rs  w2  x1+10     ;
     rx  w2  x3        ;     w2:= semaphor addr;
     rs  w0  x2        ;     sem:= sem+1;
     rl  w0  x1+2      ;     w0:= last(sem):= virtual  operation;
     rs  w0  x2+4      ;   
     rl  w3  x2+2      ;     
     se  w3     0      ;     if first(sem)=0 then
     jl.        a2.    ;
     rs  w0  x2+2      ;     first(sem):= virt operation;
     jl.        c7.    ;     else
a2:  am.       (f2.)   ;     chain(op):= virtual(operation);
     rs  w0    (4)     ;     goto exit to coruno;
     jl.        c7.    ;   end;
a3:  rs  w2  x1+10     ;   page 2(coruno):= last(sem);
     jl.        c5.    ;   goto check pages;

; open:
; w2 = semaphor addr, w3 = return;
d4:  rs. w3     f10.   ;   save w3
     ds. w1     f10.+4 ;   save w01;
     rl. w1     f1.    ;   w1:= coruno;
     bz  w0  x1+4      ;
     sz  w0     1      ;   if test(coruno) = central test then
     jl. w3     c15.   ;   test open;
     rl  w1  x2        ;
     al  w1  x1+1      ;   semaphor:= semaphor+1;
     rs  w1  x2        ;
     sl  w1     1      ;   if semaphor <= 0 then
     jl.        a1.    ;   begin comment activate;
     jl. w3     d10.   ;     get from chain(w1:= first in que, sem);
     jl. w3     d11.   ;     put in chain(first in que, activ);
a1:  am.       (f2.)   ;    end;
     rl  w3    +2      ;
     dl. w1     f10.+4 ;   get w01;
     jl.       (f10.)  ;   w3:= abs page 1; goto return;
e.
\f


; rc 18.2.71          get pages etc.          central   ...13...


b. a3 w.               ;
d7:  rl. w1     f1.    ; getpages:
     rl  w2  x1+6      ;   w2:= page 0;
     ws. w3     f2.    ;   w3:= w3 - abs addr page 0;
     jl.        d8.    ;   goto page jump;

; w1=return, w2=virt jump, w3=rel jump.
d17: am.       (f2.)   ; call:
     am        (+2)    ;
     al  w0     +2     ;   addr of return point := page 1 abs + 2;
d34: rs. w0     f10.   ; w0 call:  work:= addr of return point;
     ws. w1     f2.    ;   w1:= rel return;
     am.       (f1.)   ;
     rl  w0    +6      ;   w0:= page 0 descr;
     ds. w1    (f10.)  ;   store return point;

; page jump:
; w2 = page 0, w3 = rel return;
d8:  rl. w1     f1.    ;   w1:= coruno;
     rs  w2  x1+6      ;   page 0(coruno):= w2;
     hs  w3  x1+5      ;   relreturn(coruno):= w3;
     al  w0     0      ;
     rs  w0  x1+2      ;   state(coruno):= 0;
     jl.        c5.    ;   goto checkpages;

; clear core:
; w3 = rel return;
d14: rl. w1     f1.    ;   w1:= coruno;
     al  w0     0      ;
     rs  w0  x1+2      ;   state(coruno) := 0;
     ws. w3     f2.    ;
     hs  w3  x1+5      ;   relreturn:= w3 - page 0;
     jl.        c10.   ;   goto page missing;

; put in chain(w1, activ):
d11: al. w2     f4.    ;   w2:= activ;
; w1 = coruno, w2 = semaphor addr;
d9:  al  w0     0      ; put in chain:   w0:= 0;
     rs  w0  x1        ;   chain(coruno):= w0;
     rl  w0  x2+2      ;  
     se  w0     0      ;   if first(sem) = 0 then
     jl.        a2.    ;   comment empty chain;
     rs  w1  x2+2      ;   first(sem):= last(sem):= coruno;
     rs  w1  x2+4      ;   else
     jl      x3        ;
a2:  rs  w1 (x2+4)     ;   last(sem):= chain(last(sem)):= coruno;
     rs  w1  x2+4      ;
     jl      x3        ;   goto return;
; w1:= coruno, w2 = semaddr;
d10: rl  w1  x2+2      ; get from chain:
     rl  w0  x1        ;   w1:= first(sem);
     rs  w0  x2+2      ;   first(sem):= chain(w1);
     jl      x3        ;   goto return;
e.                     ;
\f


; rc 10.11.71          wait and exit          central   ...14...


b. a3 w.               ; central wait and check pages;
c10: rl. w2     f5.    ; page missing:
     al  w2  x2+1      ;
     rs. w2     f5.    ;   pagerque:= pagerque + 1;
     se  w2     0      ;   if pagerque = 0 then
     jl.        a2.    ;   begin
     rl. w1     f20.   ;     w1:= pager descr;
     rs  w2  x1+2      ;     state(pager):=0;
     jl. w3     d11.   ;     put in chain(pager, activ);
a2:  rl. w1     f1.    ;   end;
     al. w2     f5.    ;   w1:= coruno; w2:= pagerque;
     jl. w3     d9.    ;   put in chain(coruno, pagerque);

d12: rl. w1     f14.   ; wait:
     rs. w1     f1.    ;   w1:= coruno:= first(activ);
     se  w1     0      ;   if coruno = 0 then
     jl.        a3.    ;   begin
c3:  al  w2     0      ; first event:   event:= 0;
c4:  jd         1<11+24; next event:    wait event(event);
     se  w0     0      ;     goto if result = answer then
     jl.        c8.    ;     answer received else message received;
     jl.        c9.    ;   end;

a3:  rl  w0  x1        ;
     rs. w0     f14.   ;   first(activ):= chain(coruno);
d13:                   ; exit from pager:
c5:  rl  w0  x1+6      ; checkpages:
     jl. w3     c11.   ;   w0:= check one page(page 0);
     rl  w2     0      ;   switches to c10 if page is missing;
     rs. w2     f2.    ;   w2:= coruno code:= w0;
     rs  w2  x2        ;   core(coruno code + 0):= check one page(page 0);
     rl  w0  x1+8      ;
     jl. w3     c11.   ;
     rs  w0  x2+2      ;   core(coruno code+2):= check one page(page 1);
     rl  w0  x1+10     ;
     jl. w3     c11.   ;
     rs  w0  x2+4      ;   core(coruno code+4):= check one page(page 2);
     rl  w0  x1+12     ;
     jl. w3     c11.   ;
     rs  w0  x2+6      ;   core(coruno code+6):= check one page(page 3);
     rl  w0  x1+14     ;
     jl. w3     c11.   ;
     rs  w0  x2+8      ;   core(coruno code+8):= check one page(page 4);
e.                     ;
\f


; rc 18.2.71          wait and exit          central   ...15...


b. a6 w.               ; exit to coruno and answer
; w1 = coruno, w2 = coruno code;
     rl  w0  x1+2      ;
     sl. w0    (f0.)   ;   if state(coruno) > boss start then
     jl.        a2.    ;   goto semaphor or virtual;
     se  w0     0      ;
     jl.        a1.    ;   if state(coruno) <> 0 then goto waiting for answer;
     rl  w1  x2+4      ;   w1:= abs page 2;
c25 :   ;  after clean:
c7:  rl. w2     f1.    ; exit to coruno:   w0, w1 contains exit value;
     sn. w2    (a6.)     ;    if -, same corutine then
     jl.        a5.      ;    begin
     rx. w1     f8.      ;      get cur-prio, save w1
     al  w1   x1+2       ;      increase cur-prio
     sl  w1    1<8       ;      if prio>=max then
     jl.        c21.     ;      goto clean
     rx. w1     f8.      ;      save cur-prio, get w1
     rs. w2     a6.      ;      save new coruno
a5:                      ;    end ;
     bz  w3  x2+4      ;   w2:= coruno;
     sz  w3     1      ;   if test(coruno) = central test then
     jl.        c16.   ;   goto test exit;
c17: rl. w3     f2.    ; end test:
     rl  w3  x3+2      ;   w3:= abs page 1;
     bz  w2  x2+5      ;
c.-1   ;****** test version ******
b. a10 w.
     ds. w1     a8.    ;   save regs;
     ds. w3     a9.    ;
     rl  w1     76     ;   w1:=first area in nametable;

a0:  al  w2  x1        ; rep:
     ls  w2    -1      ;
     wa. w2     f45.   ;
     bl  w0  x2        ;   w0:=entrycount.w1;
     sh  w0    -1      ;   if entrycount<0 then
c.-1, o7, z.           ;
     jd        -7      ;     bossalarm;
     sn  w0     0      ;   if entrycount>0 then
     jl.        a1.    ;     begin
     rl  w3  x1        ;     w3:=area process addr;
     rl  w0  x3+14     ;     w0:=users.area process;
     am         (66)   ;
     sz  w0   (+12)    ;     if boss not user
     jl.        a1.    ;     then
     al  w0     24<6+21;       privout areaprocess
     al  w1  x3-4      ;
     jl. w3     d21.   ;
     bl  w0  x2        ;     w0:=entry count
c.-1, o8, z.           ;
     jd        -8      ;       bossalarm;
                       ;     end;
a1:  al  w1  x1+2      ;   w1:=next in nametable;
     se  w1    (78)    ;   if not first internal then
     jl.        a0.    ;     goto rep;
 
     dl. w1     a8.    ;   restore regs;
     dl. w3     a9.    ;
     jl.       a10.    ;

a8=k+2, 0, 0           ;   saved w0w1
a9=k+2, 0, 0           ;   saved w2w3

a10:                   ;
e.
z.   ;****** test version ******
     am.       (f2.)   ;
     jl      x2        ;   jump page 0 + rel return;
a6: 0 ; saved coruno

a1:  al. w1     f10.   ; waiting for answer:
     rl  w2     0      ; 
     jd         1<11+18;   waitanswer(work addr, state = buffer addr);
     rs  w0  x1+16     ;   save result;
     al  w2     1      ;
     ls  w2    (0)     ;   w2:= 1<result;
     sn  w2     2      ;   if normal answer then
     lo  w2  x1        ;   w0:= w0 or w2;
     al  w0  x2        ;   comment logical status;
     jl.        c7.    ;   goto exit to coruno;
a2:  sh. w0    (f7.)   ; semaphor or virtual:
     jl.        c1.    ;   if state < max core then goto lock after checkpages;
     jl.        c2.    ;   else goto open after checkpages;
; w2 = answer addr     ;
c8:  al. w1     f13.   ; answer received:   w1:= first(answer);
a3:  al  w3  x1        ; rep:  w3:=w1;
     rl  w1  x3        ;   w1:=chain(w1);
     sn  w1      0     ;   if end chain then
     jl.        c4.    ;       goto next event;
     se  w2 (x1+2)     ;   if state(w1)<> buffer addr then
     jl.        a3.    ;       goto rep;
     rl  w2  x1        ;   comment found;
     rs  w2  x3        ;   chain(w3):=chain(w1);
     sn  w2     0      ;   if last in chain then
     rs. w3     f3.+4  ;       last(answer):=w3;
     rs. w1     f1.    ;   coruno:=w1;
     bz  w0  x1+4      ;
     sz  w0     1      ;   if test(coruno) = central test then
     jl. w3     c19.   ;   test answer;
     al  w3     0      ;    w3:= coretabref:= page 2(coruno);
     rx  w3  x1+10     ;    page 2(coruno):= 0;
     sn  w3     0      ;   if coretabref = 0 then
     jl.        c5.    ;   goto checkpages;
     rl  w2  x3        ;
     la. w2     a4.    ;
     rs  w2  x3        ;   coretab(w3):= coretab(w3) - buffer bits;
     rl. w2     f6.    ;
     se  w2     -1     ;   if pager not waiting for buffer then
     jl.        c5.    ;   goto checkpages;
     jl. w3     d11.   ;   put in chain(coruno, activ);
     al  w0     0      ;
     rs. w0     f6.    ;   waiting for buffer := false;
     rl. w1     f20.   ;   coruno:=pager;
     rl  w2  x1+6      ;   corunocode:=page0(pager);
     ds. w2     f2.    ;
     jl.        d20.   ;   goto pager buffer free;
a4:  2.111111 111111 110011 111111;   remove buffer bits;
e.
\f


; rc 18.2.71          message          central   ...16...


b. a6 w.               ; message
; w2 = buffer addr, w0 = 0;
c9:  rl. w1     f22.   ; message received:
     rl  w3  x2+6      ;   w1:= post record in sender table; w3:= sender;
     sl  w3     0      ;   if message regretted then
     jl.        a1.    ;   begin
     al  w0     1      ;     get event;
     jd         1<11+26;     send answer;
     jd         1<11+22;     goto first event;
     jl.        c3.    ;   end;
a1:  rs  w3  x1-e15*10 ;   sender(last in sender table):= sender;
a2:  al  w1  x1-10     ;   while sender(x1) <> sender do
     se  w3 (x1)       ;     x1:= x1-sender table record length;
     jl.        a2.    ;
a5:  rl  w3 (x1+2)     ;    w3:= semafor;
;  sender. mess:   0   no message in que
;                  1   message in que, corutine busy
;                 >1   address of message got
     al  w0     1      ;    w0:=sender.mess;
     rx  w0  x1+8      ;    sender.mess:=1;
     sl  w0     2      ;    if message got then
     rs  w0  x1+8      ;    sender.mess:= w0;
     sh  w0     1      ;    if message got or
     sl  w3     0      ;       semafor>-1 then
     jl.        c4.    ;       goto next event;

     rs  w2  x1+8      ;    sender.mess:= message buffer addr;
     al  w3  x3+1      ;
     rs  w3 (x1+2)     ;   semaphor:= semaphor + 1;
     jd         1<11+26;   get event(w2);
     rl  w2  x1+2      ;   w2:= semaphor addr;
     rs. w1     f10.   ;   save sender table index;
     jl. w3     d10.   ;   get from chain(w1:= coruno, sem);
     rs. w1     f1.    ;   coruno:= w1;
     bz  w0  x1+4      ;  
     sz  w0     1      ;   if test(coruno) = central test then
     jl. w3     c18.   ;   test mess;
     rl. w3     f10.   ;
     al  w3  x3+4      ;
     rs  w3  x1+10     ;   page 2(coruno):= sender table index+4;
     jl.        c5.    ;   goto checkpages;
e.
\f


; rc 10.11.71          check one page          central   ...17...


; check one page:   w0 = virtual addr, w0 = abs address at return.
; if the page is not in core, the routine switches to d24.
b. a10, b10, w.        ;
c11: sh. w0    (f7.)   ; check one page:   if virt addr <= max core then
     jl     x3         ;   return
     rs. w3     b3.    ;   save w1, w2, w3;
     ds. w2     b2.    ;
     al  w3     0      ;
     ld  w0     15     ;   w3:= segm no; w0:= relative;
     am.       (f24.)  ;
     bz  w2  x3+0      ;   w2:= segm table(segm no);
     sz  w2    1<1     ;   if page not in core then
     jl.        c10.   ;   goto page missing;

     wa. w2     f21.   ;   w2:= core table addr for segment;
     rl  w1  x2        ;   w1:= first segm - core index, priority;
     bs  w3     2      ;   w3:= core index for wanted segment in page;
     la. w1     b4.    ;   clear priority part and in core bit;
     wa. w1     f8.    ;   priority part:= curr priority;
     so. w0    (b5.)   ;   if virtual address is odd then
     jl.        a2.    ;   begin
     lo. w1     f11.   ;     priority:= priority or writing;
     ws. w0     b5.    ;     w0:= relative of virt:= relative of virt - 1;
a2:  rs  w1  x2        ;   end;
     ld  w0     -15    ;   store priority in core table;
     wa. w0     f23.   ;   w0:= core index shift 9 + relative + first core place;
     dl. w2     b2.    ;   reestablish w1, w2;
     jl.       (b3.)   ;   return;

c21: rs. w0     b10.     ;   clean: save w0
     rl. w0     f12.   ;    w1 = curr priority.
     sh  w0    -1<7    ;   w0:= vivid;
     al  w0    -1<7    ;
     rs. w0     f12.   ;   vivid:= max(vivid, -max prior/2);
     wa  w0     2      ;   w0:= decrement:= curr priority + vivid;
     ws  w1     0      ;   w1:= curr priority:=
     rx. w1     f8.    ;   curr priority - decrement; save cur-prio;
     rs. w1     b2.    ;   save old w1, sawed in f8 at c7 (page 15)
     rl. w2     f21.   ;   w2:= core table base;
a4:  bl  w1  x2+1      ; rep4:
     la. w1     b7.    ;   w1:= priority part;
     sl  w1    (0)     ;   priority:= if priority part >= decrement
     rl  w1     0      ;   then priority - decrement
     ac  w1  x1        ;   else priority - priority part;
     ba  w1  x2+1      ;
     hs  w1  x2+1      ;
     al  w2  x2+4      ;    w2:= next core table entry;
     sh. w2    (f9.)   ;   if w2 <= last of core table then
     jl.        a4.    ;   goto rep4;
     dl. w1     b2.    ;   w0,w1:= saved values
     jl.        c25.   ;   goto after clean; increases curr priority;

b10=k,b2=k+2, 0, 0,  b3:  0                               ;   saving;
b4:  -1<8+1-1<10,b5:  1<15,       b7:  1<8-2          ;   masks;
e.

\f



; sl 3.12.71          prepare access          central   ...18...


; prepare access:   w01 = interval, w2 = name, name table address,
; w3 = return.
; return to x3:   no entry visible, w3 = page 1 abs.
; return to x3 + 2:   area process created, name table addr set,
; w01 = boss catalog base = interval of area process,
; w2 = total number of accesses to area process, w3 = page 1 abs.
b. a10  w.             ;
a4:    ; workspace used for testoutput of kind 20
     0     ;     +0:  name table address
     0     ;     +2:  increment
     0     ;     +4:  access count ( after incrementation )
     0,0   ;  +6,+8:  interval of process
     0,r.4 ; +10,+12,+14,+16: name
d32: ds. w3     f44.   ; prepare access:   save name addr, return;
jd-1   ;    low base, high base, name addr, return;
     al. w3     f43.   ;
     jd         1<11+72;    set catalog base;
     al  w3  x2        ;    w3:= name addr;
     jd         1<11+52;    create area process;
     rs  w0  x3+8      ;    name table addr:= dummy;
     se  w0     0      ;    if result <> area proc created
     jl.        a1.    ;    then goto abnormal return;
     al. w1     f26.   ;
     jd         1<11+16;    send dummy message;
     al. w1     f10.   ;
     jd         1<11+18;    wait answer;
     sn  w0     2      ;    if rejected then
     am        -1      ;      increment:=0
                       ;    else
     al  w2     1      ;      increment:=1;

\f


; kll 3.4.73         prepare access        central   ...18a...


a3:  dl  w1  x3+2      ; count:   w3 = name addr, w2 = increment.
     ds. w1     a4.+12 ;    test:
     dl  w1  x3+6      ;    name
     ds. w1     a4.+16 ;
     rl  w1  x3+8      ;    name table
     ds. w2     a4.+2  ;    increment
     sh  w1     50     ;    w1:= name table addr;
     jl.        a2.    ;    if dummy then goto return;
     ls  w1    -1      ; 
     wa. w1     f45.   ;    w1:= access table addr(name);
     ba  w2  x1        ;    w2:= access table:=
; testversion:
bl  w0  x1        ; if old
sl  w0     0      ;   or new value < 0 then
sh  w2    -1      ;
c. -1, o2, z.     ;    (bossfault xref)
jd        -2      ;   bossfault 2;
     hs  w2  x1        ;    access table + increment;
     rl  w1 (x3+8)     ;
     dl  w1  x1-2      ;    w01:= interval of process;
     al. w3     f43.   ;
     rs. w2     a4.+4  ;    test: value
     ds. w1     a4.+8  ;    base
     jd         1<11+72;    set catalog base;
     al  w0     18<6+20;    length, type
     al. w1     a4.    ;
     jl. w3     d21.   ;    testoutput(a4);
     rl. w3     f44.-2 ;    w3:= saved name addr;
     rl  w1 (x3+8)     ;    w1:= proc descr addr;
     rl  w0  x1+14     ;    w0:= users;
     am        (66)    ;    beware of remove entry:
     so  w0   (+12)    ;    if boss is not user then
     jl.        a2.    ;    goto return;
     sn  w2     0      ;    if access table = 0 then
     jd      1<11+64   ;    remove process;
a2:  rl. w0     a4.+2  ; return:
     sn  w0     0      ;    if increment=0 then
     jl.        a1.    ;      goto abnormal return;
     sl  w1     51     ;    w1= proc descr addr or dummy.
     dl  w1  x1-2      ;    if not dummy then
     am.       (f2.)   ;    w01:= interval;
     rl  w3    +2      ;    w3:= page 1 abs;
     am.       (f44.)  ; 
     jl        +2      ;    return to x3 + 2;
a1:  rs  w0  x3+8      ; abnormal return:    name table address := dummy
     am.       (f2.)   ; 
     rl  w3    +2      ;    w3:= page 1 abs;
     jl.       (f44.)  ;    return to x3;

; terminate access:   w2 = name, name table address, w3 = return.

d33: al  w3  x3-2      ; terminate access:   decrease return;
jd-1
     ds. w3     f44.   ;    save name addr, return;
     al  w3  x2        ;    w3:= name addr;
     al  w2    -1      ;    w2:= increment:= -1;
     jl.        a3.    ;    goto count;
e.
i.e.                   ; end central
\f



; rc 17.2.71          pager          central   ...19...


; segment table:   one entry for each segment in drum core and disk
; core, plus one dummy top entry. each entry is one byte. the
; address of the first entry is
;           segm table base + (max core + 2) //512.
; format of segment table entry:
;    s-2    section not in core.
;    s+4*c  first segment of section is in core with core index c.
;           s is 0 for first segment in section, 1 for later segments.
;           the dummy top element contains -2.
;
; segment places in core:   the segment places are 512 bytes each. a
; segment place is denoted by a core index, c. c = 0, 1, 2 . . .
; the address of the first byte in segment place c is
;           first core place + 512 * c
;
; core table:   one entry for each segment place in core, plus one
; dummy top entry. each entry is 4 bytes. the address of the first
; byte (byte 0) in an entry is
;           core table base + 4 * c
; format of core table entry:
;    byte 0:  first segm - core index     both refer to first segm of section.
;    byte 1:  priority                    format below.
;    byte 2:  length                      format below
;    byte 3:  segment number              refers to first segment in section.
;                                         < 0 for free places and job area.
; the dummy entry has priority = 4095, length = 4 - total length of table,
; segment number = -1.
;
; format of priority:
;   job < 11 + in core < 10 + buffers < 9 + bufferf < 8 + priority < 1 + writing
;   job = 1 for a job place, in core = 1 for a page requested and in core already,
;   buffers = 1 for buffers used for slow transfers, bufferf = 1 for buffers used
;   for fast transfers, priority is updated at each reference, writing = 1
;   when data in the page will be changed.
;
; format of length:
;   4*no of segments in section for first segment,0 for later segments.
;   4 for a free segment and later segment places for a job.
;
; page information list:   one entry for each of the 5 page descriptions + state
; for a corutine. each entry is 5 words as follows:
;    0:  not used for pages in permanent core. otherwise the entry is
;        chained to not_in_core or in_core.
;    2:  not used or chains to not_scheduled
;    4:  first segment in page
;    6:  length of page = 4 * no of segments
;    8:  scheduled place = 4 * core index
\f


; rc 10.11.71          pager          central   ...20...


b. b30, c10 w.         ;

b0:  0                 ; -2 save
b1:  0                 ;    save
b2:  0                 ;    saved corutine
b3:  1<23              ;    handle job page
b4:  0                 ;    in core ch, chains pages in core
b5:  0                 ;    not in core ch, chains pages not in core
f12:
b6:  -2                ;    vivid, current priority + vivid is limit for
f25:                   ;    vivid segments. vivid must be even
b7:  0                 ;    victim, address of coretable entry to be
                       ;    tested next time by find room
b8:  0                 ;    not scheduled chain, chains those pages
                       ;    not in core which are not scheduled
b9:  -1<1              ;    mask for segment table entry

b10: 0, r.25           ;    page inf list, 5 words for state and each of
b11: 0, r.5            ;    the 5 pages in the corutine description
b12: 0                 ;    saved return
b13: 0, r.4            ;    operation to backing store
b14= k+2, 0, 0         ;    work for procedure
b15= k+2, 3,-4         ;    increments, clear place (actually 4,-4, because of the carry from -4)
b16= k+2, 0, 4<12+4095 ;    empty entry in core table
b17: 0                 ;    saved return from clear place
b18: 0                 ;    skipped job places
b19:          1<11     ;    job-prio-bit whith zeroes in front
b20:          4095     ;    all-prio-bits whith zeroes in front
b21:         -1<12     ;    negative signbits


; handling of job page:  pager activated here when a corutine needs
; page transfers. page 4 is handled if it is a job place description.

d24:   0,0,0,0,0       ; start page 0:
       9<12+0          ;   page ident: pager

d23: rl. w1     f5.+2  ; entry pager:   w1:= first in pager que
     rl  w2  x1        ;   remove corutine from pager que
     rs. w2     f5.+2  ;
     rs. w1     b2.    ; handling of job page:   saved corutine:= w1
     rl  w0  x1+14     ;   w0:= page 4
     sl  w0     0      ;   if job place then
     jl.        c2.    ;   begin
     ws. w0     b3.    ;     w0:= first segm, top segm
     bs  w0     0      ;     w0:= first segm, no of segments
     ls  w0     2      ;     w0:= place length
     bz  w1     0      ;     w1:= place
     bz  w0     1      ;     w0:= length
     ds. w1     b1.    ;     save length, place
     jl. w3     c1.    ;     clear place(w0, w1)
     rl. w3     b1.    ;
     wa. w3     f21.   ;     w3:= place + core table base
     rs. w3     b7.    ;     victim:= w3;
     al  w0    -2048   ;     adjust core table:
     hs  w0  x3+1      ;     priority:= 1<11; i.e. job
     rl. w0     b0.    ;     length:= saved length
     hs  w0  x3+2      ;     w1:= saved corutine addr
     rl. w1     b2.    ;   end;
\f


; rc 17.2.71          pager, init          central   ...21...


; initialise page inf:   initialises the page information list according
; to the pages in the corutine description. pages in core are put into
; one chain, pages not in core are put into another chain.

b. a10 w.
c2:  al. w2     b10.   ; initialise page inf:   w2:= first page inf
     al  w0     0      ;   
     rs. w0     b4.    ;   in core ch:= not in core ch:= 0
     rs. w0     b5.    ;
     am        -2      ; first time: w0 := state;
a1:  rl  w0  x1+4      ; rep1:   w1+4 = page descr addr, w2 = page inf addr
     ds. w2     b1.    ;   save w1, w2
     rl  w1     0      ;   w1 := page descr or state;
     sh. w1    (f7.)   ;   if page descr <= max core then
     jl.        a5.    ;   goto next page
     ls  w1     -9     ;   w1:= segm no
     wa. w1     f24.   ;   w1:= addr of segm table(segm no)
     bz  w3  x1        ;   w3:= segm table(segm no)
     sz  w3    1<1     ;   if w3 < 0 then
     jl.        a2.    ;   goto page not in core;

     la. w3     b9.    ; page in core:
     rs  w3  x2+8      ;   page inf.scheduled place:= w3 evened
     wa. w3     f21.   ;   w3:= addr of core table entry
     rl. w0     b4.    ;
     rs  w0  x2+0      ;   page inf.chain:= in core ch
     rs. w2     b4.    ;   in core ch:= page inf addr
     al  w0     1<10   ;
     lo  w0  x3+0      ;   priority:= priority + in core
     rs  w0  x3+0      ;
     bl  w1  x3+2      ;
     bl  w0  x3+3      ;   w1:= page inf.length:= length
     ds  w1  x2+6      ;   w0:= page inf.first segm:= first segm
     jl.        a5.    ;   goto next page

a2:                    ; page not in core:   w3 = segm table(segm no)
     so  w3     1      ; rep1:   w1 = addr of segm table(segm no)
     jl.        a3.    ;   if not first in page then
     al  w1  x1-1      ;   begin segm no:= segm no -1
     bl  w3  x1        ;         adjust w1, w3 accordingly; goto rep1
     jl.        a2.    ;   end;
a3:  al  w0  x1        ;   w0:= addr of segm table(first segm)
a4:  al  w1  x1+1      ; rep4:   segm no:= segm no +1
     bl  w3  x1        ;   adjust w1, w3 accordingly
     sz  w3     1      ;   if not first in next page then
     jl.        a4.    ;   goto rep4
     ws  w1     0      ;   w1:= length:=
     ls  w1     2      ;   4*(last segm - first segm)
     ws. w0     f24.   ;   w0:= first segm:= w0 - segm table base
     ds  w1  x2+6      ;   store in page inf, w2 = page inf addr
     jl. w3     c3.    ;   chain to not in core(w2)
\f


; rc 10.11.71          pager, allocate          central   ...22...


a5:  dl. w2     b1.    ; next page:
     al  w1  x1+2      ;   w1+6:= addr of next page descr
     al  w2  x2+10     ;   w2:= addr of next page inf
     sh. w2     b11.   ;   if page inf addr <= last page inf then
     jl.        a1.    ;   goto rep1


; allocate pages:   finds suitable places for the segments. the
; result is marked as scheduled place in page inf.
     rl. w0     b5.    ; allocate pages:
     sn  w0     0      ;   if not in core ch = 0 then
     jl.        c5.    ;   goto exit pager

     rl. w1     b6.    ;
     wa. w1     f8.    ;
     jl. w3     c6.    ;   find room(current priority + vivid)
     rl. w1     b6.    ;   returns if no room
     al  w1  x1+6      ;   punish by decreasing number of vivid
     sl  w1     0      ;   segments.
     al  w1     -2     ;   vivid:= min(-2, vivid + 6)
     rs. w1     b6.    ;

     al  w1     1<9-1  ;
     jl. w3     c6.    ;   find room(buffer slow priority - 1)

a6:  rl. w2     b4.    ; rep6:   w2:= in core ch
     sn  w2     0      ;   if in core ch <> 0 then
     jl.        a7.    ;   begin
     rl  w0  x2        ;     w0:=in core ch:=chain(w2);
     rs. w0     b4.    ;
     jl. w3     c3.    ;     chain to not in core(w2)
     dl  w1  x2+8      ;     w1:= scheduled place, w0:= length
     jl. w3     c1.    ;   clear place(w0, w1); goto rep6
     jl.        a6.    ;   end;

a7:  rl. w2     f21.   ;   victim:= core table base; start from
     rs. w2     b7.    ;   base to get all holes as large as possible.
     al  w1     2047   ;
     jl. w3     c6.    ;   find room(job priority - 1)
c. -1, o4, z.          ;   (bossfault xref)
     jd        -4      ;   if no room then alarm
\f


; rc 17.2.71          pager, transfer          central   ...23...


; transfer pages:   clears the scheduled places. transfers the pages 
; and updates core table and segment table.

c4:  rl. w2     b5.    ; transfer pages:   w2:= not in core ch
a9:  dl  w1  x2+8      ; rep9:   w1:= scheduled place, w0:= length
     jl. w3     c1.    ;   clear place(w0, w1)
     rl. w2     b5.    ; adjust core table:   w2:= not in core ch
     rl  w1  x2+8      ;
     wa. w1     f21.   ;   w1:= addr of core table(scheduled place)
     rs. w1     b1.    ;   save:= addr of core table
     rl  w3  x2+4      ;   w3:= first segment of page
     al  w0  x3        ;  
     ls  w0     2      ;   w0:= first segm - core index
     ws  w0  x2+8      ;   := (first segm*4 - scheduled place)//4
     ls  w0     -2     ;
     rl  w2  x2+6      ;   w2:= length of page
     hs  w2     6      ;   w3:= length, first segment

a10: hs  w0  x1        ; rep10:   core table.first segm - core index:= w0
     rs  w3  x1+2      ;   core table.length, first segm:= w3
     bz  w3     7      ;   w3:= 0, first segment
     aa. w2     b15.   ;   w1:= core table addr:= core table addr +4
     sl  w2     1      ;   w2:= length:= length -4
     jl.        a10.   ;   if length >= 1 then goto rep10
     rl. w1     b1.    ;   w1:= saved core table addr

     al  w0     3      ; transfer section, adjust segment table:
     jl. w3     c7.    ;   transfer(w0 = input, w1 = core table addr)
     rl. w2     b5.    ;   w2:= not in core ch
     rl  w1  x2+4      ;
     wa. w1     f24.   ;   w1:= first segm + segm table base
     am         -1     ;   w0:= first:= 0 else
a8:  al  w0     1      ; rep8:   w0:= first:= 1
     wa  w0  x2+8      ; 
     hs  w0  x1        ;   segm table(segm):= scheduled place + first
     al  w1  x1+1      ;   segm:= segm +1
     bl  w0  x1        ;
     sz  w0     1      ;   if not first segm of next page then
     jl.        a8.    ;   goto rep8
     rl  w2  x2        ;
     rs. w2     b5.    ;   w2:= not in core ch:= chain(w2)
     se  w2     0      ;   if not last page then
     jl.        a9.    ;   goto rep9
e.
\f


; rc 17.2.71          pager, exit          central   ...24...


; exit pager:   simulates a lock (pagerque) and returns to cl
; which exits to the corutine just processed by the pager.
c5:  rl. w2     f5.    ; exit pager:
     al  w2  x2-1      ;   pagerque:= pagerque -1
     rs. w2     f5.    ;
     rl. w1     f20.   ;   w1:= pager descr addr
     sl  w2     0      ;   if pagerque >= 0 then
     jl. w3     d11.   ;   put in chain(pager, activ que)
     al  w0     d23-d24;   
     hs  w0  x1+5      ;   rel return(pager):= entry-page0;
     al  w0     0      ;
     rs  w0  x1+2      ;   state(pager):=0;
     rl. w1     b2.    ;   
     rs. w1     f1.    ;   coruno:= saved coruno
     jl.        d13.   ;   goto check pages


; chain to not in core:   w2 = page inf addr, w2 saved at return
; inserts the page into the chain of pages not in core, so that the lengths
; are descending through the chain. if the section is in the list
; already, it is not inserted again (e.g. two pages in same section).
b. a10 w.              ;
c3:  rs. w3     b12.   ; chain to not in core:   save return
     dl  w0  x2+6      ;   w0:= length of new page; w3:= first segment
     al. w1     b5.    ;   w1:= right place:=
     rs. w1     b14.   ;   addr of not in core ch

a1:  rl  w1  x1        ; rep:   w1:= next page inf addr
     sn  w1     0      ;
     jl.        a2.    ;   if end of chain then goto insert
     sn  w3 (x1+4)     ;   if first segment of new = w1.first segment
     jl.       (b12.)  ;   then return
     sh  w0 (x1+6)     ;   if length of new <= w1.length then
     rs. w1     b14.   ;   right place:= w1
     jl.        a1.    ;   goto rep

a2:  rl. w1    (b14.)  ; insert:   w1:= right place.chain
     rs. w2    (b14.)  ;   right place.chain:= new page inf
     rs  w1  x2        ;   new page inf.chain:= w1
     jl.       (b12.)  ;   return
e.                     ;
\f


; rc 17.2.71          pager, procs          central   ...25...


; clear place:   w0 = length(4*no of segments), w1 = place(4*core index)
; clears the core area specified. the end and the beginning of the
; area may not match existing section boundaries. the cleared core
; table entries will have priority 0, length 4, first segm -1.
b. a10 w.              ;
a1:  aa. w1     b15.   ; rep1:   w0:= length:= length+4; w1:= place:= place-4
c1:  am.       (f21.)  ; clear place:
     bl  w2  x1+2      ;   w2:= core table(place).length
     sn  w2     0      ;   if length = 0 then
     jl.        a1.    ;   goto rep1

                       ;   w1 points to beginning of a section
     rs. w3     b17.   ;   save return(b12 used by transfer)
     wa. w1     f21.   ;   w1:= addr of core table(place)
a2:  ds. w1     b14.   ; rep2:   save length, addr of place
     bl  w2  x1+1      ;   w2:= priority
     sz  w2     1<9+1<8;   if buffer then
     jl.        a6.    ;   goto wait buffer
     bl  w3  x1+3      ;   w3:= first segm
     sh  w3     -1     ;   if first segm < 0 then
     jl.        a4.    ;   goto adjust core table

     wa. w3     f24.   ; adjust segment table:   w3:= first segm + segm table base
     am         -1     ;   w0:= not in core:= -2 else
a3:  al  w0     -1     ; rep3:   w0:= not in core:= -1
     hs  w0  x3        ;   segm table:= not in core
     al  w3  x3+1      ;   w3:= next entry in segm table
     bz  w0  x3        ;
     sz  w0     1      ;   if not first of next page then
     jl.        a3.    ;   goto rep3

a4:  al  w0     5      ; adjust core table:   w0:= output operation
     sz  w2     1      ;   if priority = writing then
     jl. w3     c7.    ;   transfer(w0 = output, w1)
     dl. w1     b14.   ;   w1:= addr of place
     bs  w0  x1+2      ;
     rs. w0     b14.-2 ;   w0:= length:= length-core table.length
     bl  w2  x1+2      ;   w2:= entry length:= core table.length
     dl. w0     b16.   ;   w3, w0:= empty entry
a5:  ds  w0  x1+2      ; rep5:   core table:= empty
     aa. w2     b15.   ;   core table:= next; w2:= entry length-4
     sl  w2     1      ;   if entry length > 0 then
     jl.        a5.    ;   goto rep5

     rl. w0     b14.-2 ;   w0:= length; remaining segments to clear
     sl  w0     1      ;   if length > 0 then
     jl.        a2.    ;   goto rep2
     jl.       (b17.)  ;   return
\f


; rc 17.2.71          pager, procs          central   ...26...


a6:  al  w0     -1     ; wait buffer:
     rs. w0     f6.    ;   waiting for buffer:= true
     jl.        d12.   ;   goto wait
d20: dl. w1     b14.   ;   w0:= saved length; w1:= saved addr of place
     jl.        a2.    ;   goto rep2
e.                     ;


; transfer:   w0 = operation (3 or 5), w1 = core table address.
; transfers a section described in core table to or from virtual
; drum or disk.
b. a10 w.              ;
c7:  rs. w3     b12.   ; transfer:   save return
     hs. w0     b13.   ;   operation:= w0
     al  w2  x1        ;
     ws. w2     f21.   ;   w2:= (core table addr - core table base) *512 /4
     bz  w3  x1+2      ;
     ld  w3     7      ;   w3:= length in bytes:= length*512 /4
     wa. w2     f23.   ;   w2:= first addr:= w2+first core place
     wa  w3     4      ;   w3:= last addr:=
     al  w3  x3-2      ;   length in bytes+ first addr - 2
     ds. w3     b13.+4 ;

     bz  w0  x1+3      ;
     ws. w0     f28.   ;   w0:= first segm - first drum segm
     al. w2     f26.   ;   w2:= name of virt drum area
     am.       (f29.)  ;
     sh  w0     -1     ;   if w0 >= no of drum segments then
     jl.        a1.    ;   begin w0:= disk segment:=
     ws. w0     f29.   ;     w0 - no of drum segments
     al. w2     f27.   ;     w2:= name of virtual disk area
a1:  rs. w0     b13.+6 ;   end; segment:= w0;

     al. w1     b13.   ;   w1:= message
     jl. w3     d0.    ;   send and wait
     se  w0     2      ;    if not normal answer then
c. -1, o3, z.          ;   (bossfault xref)
     jd        -3      ;   alarm
     jl.       (b12.)  ;   return
e.                     ;
\f


; rc 17.2.71          pager, procs          central   ...27...


; find room:   w1 = limit (max priority to be overwritten).
; returns if room cannot be found for all pages in not in core chain.
; exits to transfer pages otherwise. page inf then describes the
; scheduled place.
b. a11 w.              ;
c6:  rs. w3     b12.   ; find room:   save return
     rl. w0     b7.    ;   stop:= victim
     ds. w1     b14.   ;   limit:= w1

     rl. w2     b5.    ; copy not in core chain:
     rs. w2     b8.    ;   not scheduled chain:= w2:= not in core chain
a1:  rl  w3  x2        ; rep1:   page inf.not sch ch:=
     rs  w3  x2+2      ;   page inf.chain
     al  w2  x3        ;   w2:= page inf addr:= next
     se  w2     0      ;   if not end chain then
     jl.        a1.    ;   goto rep1

     al  w1     0      ;    w1:= skipped job places:= 0;
     rl. w3     b7.    ;   w3:=victim;
a3:  bz  w2  x3+2      ;    w2:= lengt of page
     bz  w0  x3+1      ; rep3:   w0:= victim.priority
     sh. w0    (b14.)  ;   if priority > limit then
     jl.        a4.    ;   begin
     so. w0    (b19.)    ;    if not job-place then
     jl.        a11.     ;    goto addres next page
     sn. w0    (b20.)    ;    if prio= allbits (top dummy entry)
     lo. w2     b21.     ;    then make lengt negative to swop around
     wa  w1       4      ;    skipped:= skipped + length in w2
a11: wa  w3       4      ;    w3:= victim:= victim + length in w2
a2:  se. w3    (b14.-2); pass vivid sections:  if victim <> stop then
     jl.        a3.    ;     goto rep3; return no room
     rs. w3     b7.    ;   set victim correct before return
     jl.       (b12.)  ;   end

a4:  rs. w1     b18.   ;    save skipped job places;

     al  w1     0      ; find free sections:   w1:= total:= 0
     al  w0  x3        ;   w0:= place:= victim-core table base
     ws. w0     f21.   ;
a5:  ba  w1  x3+2      ; rep5:   w1:= total:= total + length
     ba  w3  x3+2      ;   w3:= victim:= victim + length
     sn. w3    (b14.-2);   if victim = stop then
     jl.        a6.    ;   goto use free section
     bz  w2  x3+1      ;   w2:= victim.priority
     sh. w2    (b14.)  ;   if priority <= limit then
     jl.        a5.    ;   goto rep5
\f


; rc 10.11.71          pager, procs          central   ...28...


a6:  rs. w3     b7.    ; use free section:   victim:= w3, w0 = place
     al. w3     b8.-2  ;   w3:= prev:= addr of not sched ch - 2
     rl  w2  x3+2      ;   w2:= addr of page inf, w1 = total
a7:  am     (x2+6)     ; next page inf:
     sh  w1     -1     ;   if total >= length of page then
     jl.        a8.    ;   begin
     rs  w0  x2+8      ;     page inf.scheduled place:= place
     wa  w0  x2+6      ;     w0:= place:= place + length of page
     ws  w1  x2+6      ;     w1:= total:= total - length of page
     rl  w2  x2+2      ;     w2:= page:= addr of next page
     rs  w2  x3+2      ;     prev.not sch ch:= addr of next page
     sn  w2     0      ;     if addr of next page = 0 then
     jl.        a9.    ;     goto end free section
     jl.        a10.   ;   end else begin
a8:  al  w3  x2        ;   prev:= addr of page inf
     rl  w2  x3+2      ;   w2:= addr of page inf  end;
a10: se  w2     0      ;   if not end chain then
     jl.        a7.    ;   goto next page inf

a9:  rl. w2     b8.    ; end free section:
     rl. w1     b18.   ;    w1:= skipped job places;
     rl. w3     b7.    ;   w3:=victim;
     se  w2     0      ;   if not scheduled chain <> 0 then
     jl.        a2.    ;   goto pass vivid sections
     wa. w0     f21.   ;   last not used := w0 := place+core table base;
     rs. w0     b7.    ;   wictim:= last not used
     ws. w0     b14.-2 ;    w0:= search length:=
     ws. w0     b18.   ;    last not used - stop - skipped job places;
     rl. w2     b6.    ;
     sh. w0    (f42.)  ;   if search length > search limit then
     am         -4     ;   vivid:= vivid + 2 else
     al  w2  x2+2      ;   vivid:= vivid - 2;
     sl  w2     0      ;
     al  w2     -2     ;   vivid:= min(-2, vivid);
     rs. w2     b6.    ;
     jl.        c4.    ;   goto transfer pages
e.
i. e.                  ; end pager
\f


; rc 7.12.71          init          central   ...29...


; core layout:
;
;    pass 1:                    pass 2:                    run:
;
;    central logic              central logic              central logic
;
;    pager                      pager                      pager
;
;
;    init                       init
;
;    external table             external table
;
;    drumcoretable              drumcoretable
;
;    diskcoretable              diskcoretable
;
;    move virt buf              move virt buf
;
;    corutine                   corutine
;
;
;
;                               coretable                  coretable
;
;                               segmenttable               segmenttable
;
;    semaphortable              semaphortable              semaphortable
;
;    terminal buffers           terminal buffers           terminal buffers
;
;    sender table               sender table               sender table
;
;    corutine table             corutine table             corutine table
;
;    file access table          file access table          file access table
;
;    run test buf               run test buf               run test buf
;
;
;
;
;
;
;
;
; content:
;
;    start of init                     d16         page 31
;    next pass                         c1          page 35
;    end init                          c2          page 35
;    simulate lock                     c3          page 38
;    dummy                             c4          page 38
;    move to virtual                   c5          page 38
;    reserve virtual                   c6          page 39
;    end pass                          c10         page 41
;    end initialize                    c11         page 44
;    init trouble                      c12-c22     page 45
;    corutine name list                g0          page 47
;


\f

; rc 10.11.71          init, variables          central   ...30...

b. c35,g10  w.
b. b70,j40  w.
b0:                        ; start of init core
b1:  3<12                  ; input of corut
b2:    0                   ; first addr
b3:    0                   ; last addr
       0                   ; segment number
b4:    0                   ; bytes wanted
b10:   0,r.10              ; work (used by wait answer)
b12:   0                   ; pass 1 or 2

b14:   0                   ; postrecord of:  corutine table
b15:   0                   ;                 semaphor table
b16:   0                   ;                 sender table
b17:   0                   ; disk or drum:
b18:   0                   ;     start of segmenttable
b20=2, 0                   ;     last not empty
b21=4, 0                   ;     segment number base
b22=6, 0                   ;     last of segment table+2
b19:   0,0,1<14,0          ; initial segment number base of disk:= 1<14
b23:   0                   ; start of final segment table
b25:   0                   ; minhole
b26:   0                   ; index
b27:   e3                  ; max corut size
b28: e14*e12               ; length of:  coruno table
b30: e15*10                ;             sender table
b31: i3*i4+i3              ;             terminal buffer area
b32:   e1                  ; virtual drum area
c. i27, <:drum:>,0,0 z.    ;
c.-i27, <:disc:>,0,0 z.    ;
      0,r.5                ;
b33:   e2                  ; virtual disk area
        <:disc:>,0,0       ; disc
      0,r.5                ;
b35: 3<12                  ; input from virt
b36:   0                   ; first addr
b37:   0                   ; last addr
b38:   0                   ; segment

b40: 5<12                  ; output to virt
b41:   0                   ; first addr
b42:   0                   ; last addr
b43:   0                   ; segment

b45:   0                   ; last of corutine+2
b46: 512+4                 ; denominator for coretable
b47:   0                   ; last of boss
0,b48: 4<12+4095           ; initial content of coretable
0,b49: 0                   ; saved register
0,b50: 0                   ; saved register
b52:   0                   ; saved rel
b53:   4095                ; last entry in coretable
b54:   0<12+4095           ; last entry in coretable
b55:   0                   ; fp base
b57: h. 9<3+e89,d23-d24 w. ; testmode,rel entry pager
0,b60: 0                   ; saved cat base
b59:   0                   ; for set base
b61:      i11              ; fraction, for core table search limit
b62:      100              ;     -     -     -     -     -     -
b63:   e3+2                ; max corutine length + 2
b64:   8<12, 6             ; move operation, set position
b65:   10                  ; constant
b66:   <:<10>testoutput on file :>, <:<0><0><0>:>, <:<10><0><0>:>
b67:   100<6+14            ; output ext table
b69:   g5.                 ; rel top of external table = start of drum table
\f


; rc 7.12.71          init, init          central   ...31...


b58:            0      ;  addr of f0
j1 =f1 -f0,j22=f22-f0,j16=f16-f0
j33=f33-f0,j32=f32-f0,j20=f20-f0
j7 =f7 -f0, j9= f9-f0,j21=f21-f0
j23=f23-f0,j24=f24-f0,j26=f26-f0
j38=f38-f0,j28=f28-f0,j29=f29-f0

b. a9  w. ;start of init:

d16:                   ; w2 = if fp then top free core else undef;
     rs. w1  b55.      ; b55:= fpbase;
     rs  w3  x3        ;  f0:=boss start
     rs. w3  b58.      ;
c. -e7                 ;    if no fp then
     am.(4,jl.+2,g8.)    ;    begin
g9:  rl  w1     66     ;      move program;
     dl  w2  x1+24     ;      w2:= top storage addr;
     rs  w1  x1        ;      boss start:= first storage addr;
     rs. w1     b58.   ;
z.                     ;    end;
     rl  w1     66     ;
     dl  w1  x1+70     ;
     ds. w1     b60.   ;    save current cat base;
     rl  w3     78     ;    proc:= first internal;

a2:  rl  w1  x3        ; rep:   w1:= descr(proc);
     rl  w0  x1+50     ;
     se  w0    (66)    ;    if parent(w1) = ego then
     jl.        a3.    ;
     sl  w2 (x1+22)    ;    w2:= min(w2, first storage(w1));
     rl  w2  x1+22     ;
a3:  al  w3  x3+2      ;    proc:= proc + 1;
     sh  w3    (80)    ;    if proc <= last then
     jl.        a2.    ;    goto rep;
     al  w2  x2-4      ;  dummy word after run test buf.
     rs. w2  b47.      ;  b47:=last of boss core;
e.

b. a10 w.

     rl. w3     b58.   ;    w3 := addr of f0;
     rs  w2  x3+j33    ;    f33 := last of runtest buffer;
     al  w2  x2-510    ;
     rs  w2  x3+j32    ;    f32 := first of runtest buffer;
     rs  w2  x3+j38    ;    f38 := first of runtest buffer;

     rl  w2     74     ;
     al  w1  x2+i1<1   ;
     rl  w2  x2+i1<1   ;
     rs  w1  x3+j16+8  ;    name table address;
     dl  w1  x2+4      ; copy name of main console;
     ds  w1  x3+j16+2  ;
     dl  w1  x2+8      ;
     ds  w1  x3+j16+6  ;

     al  w0     0      ;
     al  w3  x3+6      ;    interrupt addr := f0+6;
     jd         1<11+0 ;

\f


; sm 75.06.06          init, init          central   ...31a...

     rl  w2     76     ;    w2:= area;
a0:  rl  w3  x2        ; next area process:
     dl  w1  x3+4      ;
     ds. w1     b10.+2 ;
     dl  w1  x3+8      ;    move name(area);
     ds. w1     b10.+6 ;
     dl  w1  x3-2      ;
     al. w3     b59.   ;    set cat base(area);
     jd         1<11+72;
     al. w3     b10.   ;    remove area process(area);
     jd         1<11+64;
     al  w2  x2+2      ;    area:= area + 1;
     se  w2    (78)    ;    if area <> top then
     jl.        a0.    ;    goto next area process;
     rl. w3     b58.   ;
     al  w3  x3+f35-f0 ;    w3 := test medium name addr;
     jd      1<11+8    ;    reserve process;
     sn  w0       0    ;    if -,ok then
     jl.          a1.  ;    begin
     jd      1<11+52   ;      create area process;
     jd      1<11+8    ;      reserve process;
;    rs  w0  x3+f37-f35;      comment test output active := result;
     al  w0     4      ;      kind of medium := bs;
     rs  w0  x3+f36-f35;    end;
a1:  al. w1     b10.   ;    w1:= work;
     jd      1<11+16   ;    send and wait sense to
     jd      1<11+18   ;    set name table addr;
     rl. w0     b10.+6 ;    w0:= file no of answer;
     sh  w0    -1      ;    if file no is undefined then
     al  w0     0      ;    file no:= 0;
     al  w1     0      ;    block no:= 0;
     ds. w1     b10.+6 ;    set(file no, block no) in message;
     dl. w1     b64.+2 ;    set(move, set position) in message;
     ds. w1     b10.+2 ;
     al. w1     b10.   ;    w1:= message address;
     jd         1<11+16;    send and wait(move operation);
     jd         1<11+18;
     rl  w1  x3+f36-f35;    if kind of medium <> bs
     sn  w1     4      ;    then
     jl.        a2.    ;    begin comment magtape..;
     dl. w2     b10.+6 ;      w1:= 0; w2:= file no of answer;
     wd. w2     b65.   ;      convert file no into numbers
     al  w1  x1+48     ;      and save in text;
     se  w2     0      ;
     al  w2  x2+48     ;
     lo. w2     b66.+12;
     rs. w2     b66.+12;
     rs. w1     b66.+14;
     al. w1     b66.   ;      w1:= <:testoutput on file:>;
     jl  w3  x3+d25-f35;      outtext on main console;
a2:                    ;    end;

e.

\f


; sm 75.06.06          init, init          central   ...31b...

b. a10 w.

     al  w0     0      ;
     al. w1     g7.    ;
a1:  rs  w0  x1        ; zero fill
     al  w1  x1+2      ; until last of boss core
     sh. w1    (b47.)  ;
     jl.     a1.       ;


     al. w1     b69.   ;
     wa  w1  x1        ; w1:=top of external table
     rs. w1     b18.   ; b18:= start of drumtable;
     al  w0     e1     ; 
     ls  w0     1      ;
     wa  w1     0      ;
     rs. w1     b19.   ; b19:= start of disk table;
     rs. w1   b18.+b22 ; b18(last+2):=start of disk table;
     al  w0     e2     ;
     ls  w0     1      ;
     wa  w1     0      ;
     rs. w1   b19.+b22 ; w1:=b19(last+2):=last of disk table+2;

     rs. w1     b36.   ; b36:= first of input from virtual
     al  w1  x1+510    ; 
     rs. w1     b37.   ; b37:= last of input from virtual;
     al  w1  x1+16     ; 
     rs. w1     b2.    ; b2:= first of corutine buf
     wa. w1     b27.   ;
     rs. w1     b45.   ; w1:=b45:=first free core;
     rl. w3  b58.      ;  w3:= addr of f0;

     rl  w2  x3+j32    ; w2 := first of runtest buffer;


     rl  w1     76     ; w1:= - length file access table:=
     ws  w1     78     ;   (first internal - first area in name tab)/2;
     sz  w1     2      ; round w1 down to an even number;
     al  w1  x1-1      ;
     as  w1    -1      ; w2:= first of file access table:=
     wa  w2     2      ;   w2 - length file acess table;
     ac  w1    (76)    ;
     as  w1    -1      ; w1:= first area in name tab/2;
     wa  w1     4      ; f45:= base file access table:=
     rs  w1  x3+f45-f0 ;   first of file access table + w1;
     rs. w2     b14.   ; b14:= post record of corutine table
     ws. w2     b28.   ;
     rs. w2     b16.   ; b16:= post record of sender table;
     rs  w2  x3+j22    ; f22:=post record in sendertable;
     rs  w2  x3+j20    ; f20:= first of corutine table;
e.
\f


; kll 17.1.73          init, init          central   ...32...


b. a1 w.
     ws. w2     b30.   ;
     rl. w3  b58.      ;  w3:=addr of f0;
     ws. w2     b31.   ;
     rs. w2     b15.   ; b15:= post record of semaphortable;
     ws. w2     b45.   ; 
     sh  w2     0      ; free core:= b15-b45;
     jl.        c12.   ; if free core<0 initalarm;

     rl  w1     116    ;
     ls  w1    -9      ;
     rs  w1  x3+j28    ; f28:= first drum segment;
     rs. w1   b18.+b21 ; b18(base):= first drum segment;
     ls  w1     9      ;
     al  w0  x1-2      ;
     rs  w0  x3+j7     ; f7:= max core ;

     rl. w0  b57.      ; w0:=testmode,rel entry pager;
     al  w1  x3+d24-f0 ; w1:=addr page0 pager;
     rl  w2  x3+j20    ; w2:=addr descr pager;
     ds  w1  x2+6      ; init pager descr;
e.
\f

; rc 26.2.71          init, init          central   ...33...


     rl. w3     b58.   ; w3:= abs f0;
     al. w0     g4.    ;
     al. w1     g4.    ;
     rs  w0   x1+0<1   ; ext(0):= base of external table;
     al  w0  x3+d0-f0  ;
     rs  w0   x1+1<1   ; ext(1):= send and wait;
     al  w0  x3+d1-f0  ;
     rs  w0   x1+2<1   ; ext(2):= send and wait fast;
     al  w0  x3+d3-f0  ;
     rs  w0   x1+3<1   ; ext(3):= lock;
     al  w0  x3+d4-f0  ;
     rs  w0   x1+4<1   ; ext(4):= open;
     al  w0  x3+d5-f0  ;
     rs  w0   x1+5<1   ; ext(5):= lock chained;
     al  w0  x3+d6-f0  ;
     rs  w0   x1+6<1   ; ext(6):= open chained;
     al  w0  x3+d7-f0  ;
     rs  w0   x1+7<1   ; ext(7):= get pages;
     al  w0  x3+d8-f0  ; 
     rs  w0   x1+8<1   ; ext(8):= page jump;
     al  w0  x3+d2-f0  ; 
     rs  w0   x1+9<1   ; ext(9):= send and wait slow;
     al  w0    -1      ;
     rs  w0   x1+10<1  ; ext(10):= alarm;
     al  w0  x3+d14-f0 ;
     rs  w0   x1+11<1  ; ext(11):= clear core;
     al. w0     c6.    ;
     rs  w0   x1+12<1  ; ext(12):= reserve virt;
     al. w0     c4.    ;
     rs  w0   x1+13<1  ; ext(13):= dummy (move virt);
     rs  w0   x1+14<1  ; ext(14):= dummy (simulate lock);
     rs  w0   x1+24<1  ; ext(24):= dummy(put in activ chain);
\f




; kll 3.4.73        init, init       central   ...33a...


     al. w0     c2.    ;
     rs  w0   x1+15<1  ; ext(15):= end init;
     al. w0     b0.    ;
     rs  w0  x3+j23    ;
     rs  w0   x1+17<1  ; ext(17):= first core place;
     al  w0  x3+d21-f0 ;
     rs  w0  x1+21<1   ; ext(21):= coruno output;
     al  w0  x3+j16    ;
     rs  w0   x1+23<1  ; ext(23):= name of main console
     al  w0  x3+d17-f0 ;
     rs  w0   x1+25<1  ; ext(25):= call;
     al  w0  x3+j1     ;
     rs  w0   x1+26<1  ; ext(26):= current corutine;
     al. w0     c7.    ;
     rs  w0  x1+27<1   ; ext(27):= carriage return;
     al  w0  x3+f39-f0 ;
     rs  w0  x1+28<1   ; ext(28):= boss start time addr;
     al  w0     i116   ;
     rs  w0  x1+29<1   ; ext(29):= number of work places;
     al  w0  x3+d26-f0 ;
     rs  w0  x1+30<1   ; ext(30):= stop and wait;
     al. w0     d27.   ;
     rs  w0  x1+31<1   ; ext(31):= init alarm;
     al. w0     d32.   ;
     rs  w0  x1+32<1   ; ext(32):= prep access;
     al. w0     d33.   ;
     rs  w0  x1+33<1   ; ext(33):= term access;
     al  w0  x3+d34-f0 ;
     rs  w0  x1+34<1   ; ext(34):= w0 call;
     al  w0  x3+d35-f0 ;
     rs  w0  x1+35<1   ; ext(35):= wait answer;
     al  w0  x3+f42-f0 ; 
     rs  w0  x1+36<1   ; ext(36):= search limit;
     al  w0  x3+f37-f0 ;
     rs  w0  x1+37<1   ; ext(37) := testoutput switch;
     al  w0  x3+f34-f0 ;
     rs  w0  x1+38<1   ; ext(38) := current segment in bosstest;
     al  w0  x3+f51-f0 ;
     rs  w0  x1+39<1   ; ext(39) := name table address(bosstest);
     al. w0     c29.   ;
     rs  w0  x1+40<1   ; ext(40):=set external;
     rl. w0    b15.    ;
     rs  w0  x1+150<1  ;  ext(150):= start of terminal area;
\f


; rc 22.12.71          init, testoutput          central   ...34...


b. a10  w.
     jl.        a4.    ;
a3:  <:bos:>,0,r.12    ; coruno output, bos ident;
a5:  0, r.e29>1        ; name of installation
a9:  e29<6 + 13        ; length, kind of init text
a6:  e0. - h99         ; addr of installation name (in options)

; the following code is executed during assembling:
a7:  al. w1     a5.    ;   move installation name;
     al. w2     a6.    ;
     wa  w2  x2        ;
a8:  rl  w0  x2        ;
     rs  w0  x1        ;
     al  w1  x1+2      ;
     al  w2  x2+2      ;
     sz  w0     255    ;
     jl.        a8.    ;
     al  w0     0      ;   ok-return to slang
     al  w2     0      ;
     jl      x3        ;
     jl.        a7.    ;   start jump-code;
j.
; end of jump-code
a4:
     al  w0     0      ;
     rl  w1     106    ;  boss start time:= microsec + time;
     aa  w1     110    ;
     ds  w1  x3+f39-f0 ;
     ds. w1     a3.+10 ;
     dl  w1  x3+6      ;
     ds. w1     a3.+16 ;    move version ident of bos 
     dl  w1  x3+10     ;
     ds. w1     a3.+20 ;
     am        (66)    ;    move first,last core;
     rl  w0    +22     ;
     rl. w1     b47.   ;
     al  w1  x1+2      ;
     ds. w1     a3.+24 ;

     al. w1     a5.    ;
     rl. w0     a9.    ;
     am.       (b58.)  ;
     jl  w3     d21-f0 ;    coruno output(installation name);
     al. w1     a3.    ;
     al  w0     26<6+13;    w0:= 26 bytes, kind 13;
     am.       (b58.)  ;
     jl  w3     d21-f0 ;    coruno output(bos ident);
e.                     ;

\f



; rc 4.2.72          init, loader          central   ...35...


b. a1 w.
c1:                    ; next pass:
     am        -10     ;
     al. w0     g0.    ;
     rs. w0     g2.    ; next name:= first name-10;
     al. w3    (g4.)   ; note: indirect to enable tracing ofexternal references
     rl. w0     b14.   ;
     rs  w0    x3+18<1 ; ext(18):= post record of coruno table;
     rl. w0     b15.   ;
     rs  w0    x3+19<1 ; ext(19):= post record of semaphor table;
     rl. w0     b16.   ;
     rs  w0   x3 +20<1 ; ext(20):= post record of sender table;
     rl. w3     b18.   ; 
     al  w3  x3-2      ;
     rs. w3   b18.+b20 ; b18(last not empty):= start-2;
     rl. w3     b19.   ;
     al  w3  x3-2      ;
     rs. w3   b19.+b20 ; b19(last not empty):= start-2;
     rl. w3     b18.   ;
     rl. w2   b19.+b22 ;
     al  w0     512    ;
a1:  rs  w0  x3        ; fill disk and drum table
     al  w3  x3+2      ;
     sh  w3  x2-1      ; with 512
     jl.        a1.    ;
e.


b. a3 w.
c2:                    ; end init:
     al. w3     b59.   ;
     dl. w1     b60.   ; reestablish cat base
     jd      1<11+72   ;
     rl. w3     g2.    ;
     al  w3  x3+10     ;
     rs. w3     g2.    ; x3:= nextname:= nextname + 10;
     sl. w3     g1.    ; if nextname > lastname then
     jl.        c10.   ; goto end pass;
c.e7,al  w2     10     ; if fp then
     am.       (b55.)  ;  begin
     jl  w3     h26-2  ;    outchar(10);
     rl. w0     g2.    ;
     am.       (b55.)  ;    outtext(coruno name);
     jl  w3     h31-2  ;  end;
z.
\f



; rc 26.4.72          init, loader          central   ...36...


     rl. w3     g2.    ; w3:= name addr;
     jd       1<11+52  ; create area process;
     al. w1     b10.   ; 
     jd         1<11+42; lookup entry;
     se  w0     0      ;
     jl.        c13.   ; if not exist then goto init trouble;
     rl  w1  x1+18     ; w1:=length(entry);
     al  w1  x1+511    ; round w1 up to segments
     ls  w1    -9      ;
     ls  w1    +9      ;
     sl. w1    (b63.)  ; if w1>max corutine area then
     jl.        c16.   ;    goto init trouble;
     rs. w1     b4.    ; bytes wanted:= w1;
     wa. w1     b2.    ;
     rs. w1     b3.    ; last addr:= first addr+bytes wanted;
     al. w1     b1.    ;
     jd       1<11+16  ; send message
     al. w1     b10.   ;
     jd       1<11+18  ; wait answer
     se  w0     1      ;
     jl.        c14.   ; if result<>1 then goto init trouble;
     rl. w1     b10.+2 ;
     se  w1     0      ;
     se. w1     (b4.)  ; if bytes transfered<>bytes wanted or = 0 then
     jl.        c15.   ; goto init trouble;
     jd       1<11+64  ; remove area process
     rl. w2     b2.    ;    w2:= first addr; w3 = name addr.
     dl  w1  x3+2      ;
     ds  w1  x2-12     ;    move name;
     dl  w1  x3+6      ;
     ds  w1  x2-8      ;
     al. w3    (g4.)   ;    w3:= base external table;
                       ;    note: indirect to enable tracing of external references
     dl  w1  x3+19<1   ;
     ds  w1  x2-4      ;
     rl  w1  x3+20<1   ;    move ext18, 19, 20;
     rs  w1  x2-2      ;
     al  w0     22<6+13;    w0:= 22 bytes, kind 13;
     al  w1  x2-14     ;
     am        -2000   ;
     jl. w3     d21.+2000;  coruno output;

     rl. w3     b2.    ;    w3:= first addr;
     al  w3  x3+8      ;    w3:= first of external list;
\f


; sl 24.6.72          init, loader          central   ...37...

a1:  rl  w1  x3        ; rep:   w1:= rel external word;
     sl  w1     1      ; if w1 <= 0 then
     jl.        a0.    ; begin
     sn  w1     0      ;   if w1 = 0 then
     jl      x3+2      ;   exit to coruno;
     ws  w3     2      ;   w3:= ext word addr - ext word;
     jl.        a1.    ;   goto rep;
a0:                    ; end;
     wa  w1     6      ; w1:= abs external word;
     so  w1     1      ; if w1 uneven then
     jl.        a2.    ; begin
 
     bl  w2  x1        ;   w2:= number * 2;
     ls  w2     1      ;   
     rl. w0  x2+g4.    ;   displacement(w1):=
     hs  w0  x1        ;   external;
     jl.        a3.    ; end else

a2:  bl  w2  x1+1      ; begin
     ls  w2     1      ;   w2:= number * 2;
     bz  w0  x1        ;   w0:=reservation
     sh  w2    -1      ;   if external < 0 then
     al  w0     0      ;   reservation:=0
     ac  w0    (0)     ;   w0:=-reservation
     wa. w0  x2+g4.    ;     + external
     rs. w0  x2+g4.    ;   external:=w0
     rs  w0  x1        ;   external word:=external
                       ; end;
a3:  al  w3  x3+2      ; w3:= next;
     jl.        a1.    ; goto rep;
e.

; set externals:
; transferring externals from coroutine-initialisation to external table
;       call        return
; w0    irr.        unchanged
; w1    irr.        unchanged
; w2    irr.        unchanged
; w3    table addr. return addr.

c28: 0,  0,  0
c29: rs. w0     c28.   ;    save registers
     ds. w2     c28.+4 ;    
     al  w3  x3+2      ;    w3:=start of set-external-table
     rl. w2     g4.    ;    w2:=start of external table
c30: rl  w1  x3+2      ; rep:  w1:=external number
     sn  w1    -1000   ;    if stop number then
     jl.        c31.   ;    goto restore
     ls  w1     1      ;
     sh  w1     e4     ;    if external outside limits
     sh  w1    -e5-2   ;    then
     jl.        c24.   ;    goto alarm
     wa  w1     4      ;    w1:=abs addr. of external
     rl  w0  x3        ;    w0:=external value
     rs  w0  x1        ;    ext(number):=w0
     al  w3  x3+4      ;
     jl.        c30.   ;    goto rep

c31: rl. w0     c28.   ; restore:
     dl. w2     c28.+4 ;
     jl      x3+4      ;    return



\f

; rc 26.2.71          init, move to virt          central   ...38...


b. a3 w.
c3:  rs. w3     b10.   ; simulate lock:
     rl  w3  x2        ;
     al  w3  x3-1      ; semaphor:= semaphor-1;
     rs  w3  x2        ;
     am.       (b58.)  ;
     jl  w3     d9-f0  ; put in chain(coruno,sem);
     jl.        (b10.) ; goto return;
c4:  jl      x3        ; dummy: goto return
c7:  c. e7             ; carriage return:
     ds. w1     b10.+2 ;
     ds. w3     b10.+6 ;    save registers;
     al  w2     10     ;
     am.       (b55.)  ;    outchar(10);
     jl  w3     h26-2  ;
     dl. w1     b10.+2 ;   
     dl. w3     b10.+6 ;    restore registers;
z.   jl      x3        ;   return;

; move to virtual:
; entry:  w0=start addr, w1=length,  w2=virt addr,  w3=return
; exit:   w0,w1,w2,w3 unchanged
c5:  ds. w3     b49.   ;
     ds. w1     b50.   ;
     rs. w0     b41.   ; first addr:= w0;
     al  w1  x1+511    ;
     ls  w1     -9     ;
     ls  w1     9      ; bytes wanted:= w1 rounded up
     rs. w1     b4.    ;   to a number of segments;
     al  w1  x1-2      ;
     wa  w1     0      ;
     rs. w1     b42.   ; last addr:= first addr+bytes wanted-2;
     sl. w1     (b45.) ; if last addr>last of corutine then
     jl.        c16.   ; goto init trouble;
     ls  w2    -9      ;
     rl. w3  b58.      ;
     ws  w2  x3+j28    ;
     al  w0  x2+1      ; 
     sh  w0  (x3+j29)  ;
     jl.        a1.    ;
     ws  w2  x3+j29    ;
     am       f27-f26  ;
a1:  al  w3  x3+j26    ; w3:= name addr(virt addr);
     rs. w2     b43.   ;
     rs. w2     b38.   ; b43:= b38:= segment number;
     rl. w0     b49.-2 ;
     ls  w0     15     ;
     ls  w0    -15     ; w0:= rel in segment;
     rl. w1     b50.   ;
     sl  w1     512    ; if length<512 then
     jl.        a3.    ; begin
     rs. w0     b52.   ;    b52:= saved rel;
     al. w1     b35.   ;    send message input from virt
     jd       1<11+16  ;
     al. w1     b10.   ;
     jd       1<11+18  ;   wait answer
     rl. w1     b10.+2 ;
     sn  w1     512    ;   if bytes transfered<>512 or
     se  w0     1      ;   result<>1 then
     jl.        c17.   ;   goto init trouble;

\f

; rc 26.2.71          init, res virt          central   ...39...


     rl. w1     b50.-2 ;   w1:= start of page
     rl. w2     b36.   ;
     wa. w2     b52.   ;   w2:= start of buf+rel;
     al  w0  x1-2      ;
     wa. w0     b50.   ;
     rs. w0     b52.   ;   b52:= last move word;
a2:  rl  w0  x1        ;
     rs  w0  x2        ;
     al  w1  x1+2      ;   move page to buffer;
     al  w2  x2+2      ;
     sh. w1     (b52.) ;
     jl.        a2.    ;
     dl. w2     b37.   ;   first, last addr of output:=
     ds. w2     b42.   ;   first, last addr of input;
a3:                    ; end;
     al. w1     b40.   ;
     jd       1<11+16  ; send message(output);
     al. w1     b10.   ;
     jd       1<11+18  ; wait answer;
     lo. w0     b10.   ; result or hard error;
     rl. w1     b10.+2 ;
     sn. w1     (b4.)  ; if bytes transfered<>bytes wanted
     se  w0     1      ;    or result<>1 then
     jl.        c18.   ; goto init trouble;
     dl. w3     b49.   ; reestablish registers;
     dl. w1     b50.   ;
     jl      x3        ; goto return;

; reserve virtual:
; entry:  w0 extract 1 = 0: drum else disk,  w1=length of page
; exit:   w0,w1 unchanged,  w2= virtual addr
; when reserve virt is called successive on the same device
; with length >= 512 then the pages got will be consecutive.
c6:  ds. w1     b10.+2 ;
     rs. w3     b10.+4 ; save w0, w1, w3
     sz  w0     1      ;
     am       b19-b18  ;
     al. w2     b18.   ;
     rs. w2     b17.   ; b17:= table addr for drum or disk
     rl  w3  x2+b20    ; w3:= index:= last not empty+2;
     al  w3  x3+2      ;
e.


b. a8 w.
     sh  w1     510    ; if length>=512 then
     jl.        a5.    ; begin
a0:  al  w0  x3        ;    found:
     ws  w0  x2+0      ;   w0:=(index-start)>1;
     ls  w0  -1        ;
     wa  w0  x2+b21    ;   w0:=(w0+segment base)*512;
     ls  w0  9         ;
     rl  w2  x3        ;
     ws  w2  2         ;   w2:= 512-core(index);
\f


; rc 22.12.71          init, res virt          central   ...40...


     sh  w2  0         ;
     al  w2  0         ;   core(index):= max(0,core(index)-length);
     rx  w2  x3        ;
     ac  w2  x2-512    ;
     wa  w2     0      ;    w2:= virt addr:= w0+w2;
     rs. w2     b10.+6 ;
     am.       (b58.)  ;
     rl  w0     j24    ;    w0:= base segment table;
     sh  w0     0      ;    if during pass 2 then
     jl.        a1.    ;    begin
     ls  w2    -9      ;
     wa  w2     0      ;      segment table(virt addr):= -2;
     al  w0     -2     ;
     hs  w0  x2        ;      w2:= saved virt addr;
     rl. w2     b10.+6 ;      test output, w1 = length, w2 = virt;
                       ;    end;
a1:  sh  w1  512       ;   while length>512 do
     jl.     a3.       ;      begin
     al  w0     0      ;
     rs  w0  x3        ;          core(index):= 0;
     al  w3  x3+2      ;          index:= index+2;
     al  w1  x1-512    ;          length:= length-512;
     jl.        a1.    ;       end;
a3:  rl. w1     b17.   ;    w1:= table addr disk or drum;
     rl  w0  x1+b20    ;    w0:= last not empty;
     sl  w0  x3-2      ;
     jl.        a4.    ;    if w0<index-2 then core(index):= 0;
     al  w0     0      ;    comment do not use the
     rs  w0  x3        ;            rest of a long section;
a4:  sh  w3 (x1+b20)   ;
     rl  w3  x1+b20    ;
     rs  w3  x1+b20    ;    last not empty:= max(last not empty,index);
     sl  w3 (x1+b22)   ;

     jl.        c19.   ;    if last not empty>last then goto init trouble;
c.e7                   ;    if fp then
     al  w0  x2        ;    outinteger(virt addr);
     am.       (b55.)  ;
     jl  w3     h32-2  ;
     1<23+32<12+8      ;
z.                     ;
     dl. w1     b10.+2 ;    reestablish w0,w1
     jl.       (b10.+4);    goto saved exit
                       ; end else
a5:  al  w0     512    ; begin
     rs. w0     b25.   ;    minhole:= 512;
     rs. w3     b26.   ;   index:= last not empty+2;
     rl  w3  x2+0      ;
     jl.        a8.    ;    for w3:=start step 2 until last not empty do
a6:  rl  w0  x3        ;
     sl  w0  x1        ;    if core(w3)>=length and
     sl. w0    (b25.)  ;       core(w3)<minhole then
     jl.        a7.    ;    begin
     rs. w3     b26.   ;       index:= w3;
     rl  w0  x3        ;       minhole:= core(w3);
     rs. w0     b25.   ;    end;
a7:  al  w3  x3+2      ;
a8:  sh  w3 (x2+b20)   ;    w3:= index;
     jl.        a6.    ;    goto found;
     rl. w3     b26.   ;
     jl.        a0.    ; end;
e.

\f

; rc 26.2.71          init, end pass          central   ...41...


b. a3 w.
c10: rx. w3     b12.   ; end pass:
     se  w3     0      ; if after second pass then
     jl.        c11.   ; goto end of initialize;
     al. w3     b59.   ;
     am        (66)    ; set base to boss standard;
     dl  w1    +78     ; prepares for create drum, disccore;
     jd         1<11+72;
     rl. w3     b58.   ; w3:= addr of f0;
     al. w1    (g4.)   ; w1 := abs external table;
                       ;    note: indirect to enable tracing of external references
     al  w0     4      ;
     wa  w0  x1+507<1  ; w0 := 4 + segments in jobfile + length of savebuf
     wa  w0  x1+508<1  ;         + segments in fobdescr;
     ac  w2     i62    ; w2:= -length of save buffer
     wa  w2  x1+507<1  ;      +length of save buffer + segments in jobfile
     wa  w2  x1+509<1  ;      +length of psjob mount code + size of mount action table
                       ;         + size of mount table
     wa  w2  x1+510<1  ;      +size of request line page
     sh  w0    (4)     ;
     al  w0  x2        ; w0:=max( w0, w2 );
     sl  w0     i116+1 ; if w0 > i116 (= min segment places) then
     jl.        c23.   ;  alarm;
     al. w0     c5.    ;
     rs  w0   x1+13<1  ; ext(13):= move virtual;
     al. w0     c3.    ;
     rs  w0   x1+14<1  ; ext(14):= simulate lock;
     al  w0  x3+d11-f0 ;
     rs  w0  x1+24<1   ; ext(24):= put in activ chain;
     rl  w2  x1+52<1   ;    move request free addr and
     rs  w2  x3+4      ;      max request free (for performon)
     rl  w0  x2        ;
     rs  w0  x3+2      ;
     rl. w1    b18.+b20;
     ws. w1     b18.   ;
     al  w1  x1+2      ;
     ls  w1    -1      ; w1:= number of segments in drumcore;
     rs. w1     b32.   ; b32:= w1;
     am.     (b58.)    ;
     rs  w1   j29      ; f29:=w1;
     wa. w1  b18.+b21  ;
     rx. w1  b19.+b21  ; b19(base):=b18(base)+w1;
     wa. w1  b19.+b21  ;
     ls  w1  9         ; w1:=1<23+b19(base)*512;
\f


; re 11.10.73               init, end pass             central   ...41a...

     al. w2      g4.   ;
     al  w3  x2+e4     ;
a1:  rl  w0  x2        ; for i:= first ext step 1 until last ext do
     sh  w0    -1      ; if ext(i)<0 then
     wa  w0     2      ;    ext(i):=ext(i)+w1;
     rs  w0  x2        ;   comment adjust virt disc addr, 1<23 is removed 
     al  w2  x2+2      ;          by integer overflow and b19(base) is added;
     sh  w2  x3        ;
     jl.        a1.    ;
     am         e4+4   ;
     sl. w2     g4.    ;
     jl.        a2.    ;
     rl  w2  x3-e4+18<1; comment adjust virt addresses
     rl. w3     b14.   ;   in corutine table;
     jl.        a1.    ;
a2:  rl. w1   b19.+b20 ;
     ws. w1     b19.   ;
     al  w1  x1+2      ;
     ls  w1    -1      ; w1:= number of segments in disk core
     rs. w1     b33.   ; b33:= w1;
     wa. w1  b32.      ; w1:=no of segments;
     ac  w2  x1+1      ; w2:=-(no of segments+1);
     sz  w2  1         ; if odd then
     al  w2  x2-1      ;   w2:=w2-1;
     al. w3    (g4.)   ; w2:=first byte in segmenttable
                       ; note: indirect to enable tracing of external references
     wa  w2  x3+19<1   ;   :=w2+addrof first semaphor;
\f


; rs 22.12.71          init, end pass          central   ...42...


     al  w0  -2        ; w0:=-2;
a3:  am      x1        ; while w1>0 do begin
     hs  w0  x2        ;                 segm table(w1):=w0;
     al  w1  x1-1      ;                 w1:=w1-1;
     al  w0  -1        ;                 w0:=-1;
     sl  w1  0         ;               end;
     jl.     a3.       ;
     rs. w2     b23.   ; b23:= start of segment table;
     am.     (b58.)    ;
     rl  w3   j7       ;
     al  w3  x3+2      ; w1:= w2-(max core place-2)//512;
     ls  w3    -9      ;
     al  w1  x2        ;
     ws  w1     6      ;
     rl. w3    b58.    ; w3:=base of f-names;
     rs  w1  x3+j24    ; f24:=segment table base;
     al  w1  x2-8      ;  -8 bytes = 2 entries
     rs  w1  x3+j9     ; f9:=last real entry of coretable;
e.


b. a10 w.
     jl.        a9.    ;

a1: 0,0,0,0            ; name of bs-device for drumcore
a2: 0,0,0,0            ;   -  -  -    -     -  disccore
a3: e99. - h99         ;
a4: e100.- h99         ;

; j. code 

a5:  al. w1     a1.    ;
     al. w2     a3.    ;
a6:  wa  w2  x2        ;
a7:  rl  w0  x2        ;
     rs  w0  x1        ;
     al  w1  x1+2      ;
     al  w2  x2+2      ;
     sz  w0     255    ;
     jl.        a7.    ;
     rl. w1     a2.    ;  w1:= first word of disccore bs-name
     se  w1     0      ;  if w1<>0 then both names have been copied
     jl.        a8.    ;
     al. w1     a2.    ;
     al. w2     a4.    ;
     jl.        a6.    ;
a8:  al  w0     0      ;
     al  w2     0      ;
     jl      x3        ;
     jl.        a5.    ;
j.

; end of j. code to include bs-devicename for drumcore and disccore
a9:

     al  w1  x2        ;
     al. w0     b0.    ;
     ws  w1     0      ; w1:= length of runtime core;
     al  w1  x1-4      ; dummy entry
     al  w0     0      ;
     wd. w1     b46.   ; w1:= w1//(512+4);
     am.       (g4.)   ; note: indirect to enable tracing of external references
                       ;   ext(16):= number of core places;
     rs  w1     16<1   ;
     ls  w1     2      ;
     ac  w0  x1        ;
     hs. w0     b54.   ; set length in last entry;
     al  w1  x1+4      ;
     ws  w2     2      ;
     sh. w2  (b45.)    ; if first of core table<last of corut
     jl. w3   c12.     ;   then goto init trouble;
     rs  w2  x3+f25-f0 ; w2:= f25:=
     am.       (g4.)   ; note: indirect to enable tracing of external references
     rs  w2  156<1     ;  ext(156):=
     rs  w2  x3+j21    ; f21:= first of core table;
     rs  w1  x3+f41-f0 ;   core table length:= w1;
     wm. w1     b61.   ;
     wd. w1     b62.   ;   search limit:= core table length
     rs  w1  x3+f42-f0 ;   * fraction / 100;
\f


; rc 22.12.71          init, end pass          central   ...43...


     al  w2  x2+2      ;
     dl. w1     b48.   ; fill
a10: ds  w1  x2        ; core table:= 0,4<12+4095;
     al  w2  x2+4      ;
     sh. w2    (b23.)  ;
     jl.        a10.   ;

     dl. w1     b54.   ; set last entry;
     ds  w1  x2-4      ;

     al. w1    (g4.)   ; note: indirect to enable tracing of external references
     rl  w2  x1+18<1   ;  w0:=coruno table start - pager;
     al  w0  x2-e12    ;
     rs  w0  x1+102<1  ;  ext(102):= page descr;
     rl  w1  x1+20<1   ;
     wa. w1  b30.      ;  w1:=sender table start  + length;
     rl. w2  b16.      ;
     sn  w0  x2        ;  
     se  w1  x2        ;  if w0 or w1 <> post record of sender table then
     jl.     c22.      ;      goto init trouble;
     rl  w2     66     ;
     dl  w1  x2+74     ;
     al. w3     b59.   ;    set base to
     jd         1<11+72;    boss max base;
     dl. w3     a1.+2  ; move preferred
     ds. w3     b32.+4 ; bs-device name
     dl. w3     a1.+6  ; to tail
     ds. w3     b32.+8 ;
     rl. w3     b58.   ; w3 := addr of f-names
     al  w3  x3+j26    ; w3 := addr of <:drumcore:>
     al. w1     b32.   ; w1:= tail addr;
     rl  w2  x1        ; w2:=size (in case of trouble);
     jd       1<11+48  ; remove
     jd       1<11+40  ; create
     al  w1  3         ;
     jd      1<11+50   ; permanent(3);
     jd       1<11+52  ; create area process
     jd       1<11+8   ; reserve process
     se  w0     0      ; if result<>0 then
     jl.        c20.   ; goto init trouble;
     dl. w3     a2.+2    ;
     ds. w3     b33.+4 ;
     dl. w3     a2.+6  ;
     ds. w3     b33.+8 ;
     rl. w3     b58.   ;
     
     al  w3  x3+f27-f26+j26; w3:=addr of<:disccore:>;
     al. w1     b33.   ;
     rl  w2  x1        ; w2:=size (in case of trouble);
     jd       1<11+48  ;
     jd       1<11+40  ;
     al  w1  3         ;
     jd      1<11+50   ;
     jd       1<11+52  ;
     jd       1<11+8   ;
     se  w0     0      ;
     jl.        c21.   ;

\f


; sm 75.06.06          init, end pass         central   ...43a...

     al  w2    -e5     ;    w2 := rel first pre-external;

a0:  al. w1  x2+g4.    ; rep:w1 := abs external table part;
     rl. w0     b67.   ;    w0 := 100 bytes, kind 14;
     as  w2    -1      ;
     am.       (b58.)  ;
     jl  w3    +d37-f0 ;    w2 output(ext table);
     ls  w2     1      ;
     al  w2  x2+100    ;    increase part pointer;
     sh  w2     e4-2   ;    if not all is output then
     jl.        a0.    ;      goto rep;
     rl. w3     b58.   ;
     jl  w2  x3+d36-f0 ;    outblock;

     rl. w3     b58.   ;    comment: this call forced a buffer change;
     rl  w1  x3+f34-f0 ;    cyclestart := segment count ;
     rs  w1  x3+f47-f0 ;

     jl.        c1.    ; goto next pass;

c8:  al  w0     1      ; reserve access(name table):
     sl  w1    (76)    ;    if process is not
     sl  w1    (78)    ;      area process then
     jl      x3        ;      return;
     ls  w1    -1      ;
     am.       (b58.)  ;    access table(name table);
     wa  w1     f45-f0 ;
     hs  w0  x1        ;
     jl      x3        ;    return;
e.
\f

; rc 26.2.71          init, end          central   ...44...


b. a50  w. b. a5, j5, m5  w.
j3:  <:boss:>, 0, 0, 0  ;  name of process, name table addr
c. e16 ; if monitor mode not wanted then include:
c.-e80
j4:  4                  ;  no of storage bytes to be changed in one pass of the
                        ;  message buffer code loop

;  subroutine which changes the protection key of boss core area if boss is
;  started in monitor mode.
;***** the code is transferred to a message buffer and executed there *****
;  call: 
;     w0= new protection key
;     w1= link
;         link:   last of boss own core
;         link+2: return addr
;     w2= base of first core addr to be changed
;     w3= proc descr addr

m0:  ks  w0  x2+2      ;rep:
     ks  w0  x2+4      ;     change protection key
     al  w2  x2+4      ;     w2:=w2+4;
     se  w2 (x1)       ;     if w2 < last core then 
     jl.        m0.    ;       goto rep;
     jd.        2      ;
     hs  w0  x3+33     ;     change pk in proc descr;
     je  w2  x1+2      ;
z.
z.

c11:                   ; end of initialize:
c. e7

     al. w0     j1.     ; write externals(fp mode):
     am.      (b55.)    ;
     jl  w3    h31-2    ;   outtext(<:externals:>);
     al  w1      -e5    ;
     rs. w1     j0.     ;   ext := -e5;
a0:  bl  w0      2      ; rep:
     wd. w1     j2.     ;
     se  w0      0      ;   if ext mod 20 <> 0 then
     jl.        a1.     ;   goto write;
     al  w2     10      ;
     am.      (b55.)    ;
     jl  w3    h26-2    ;   outchar(10);
     rl. w0     j0.     ;
     as  w0     -1      ;
     am.      (b55.)    ;
     jl  w3    h32-2    ;   outinteger (ext // 2);
     1<23 + 32<12 + 4   ;
     al  w2     58      ;
     am.      (b55.)    ;
     jl  w3    h26-2    ;   outchar(58);
a1:  rl. w1     j0.     ; write:
     rl. w0  x1+g4.     ;
     am.      (b55.)    ;
     jl  w3    h32-2    ;   outinteger (word (ext));
     1<23 + 32<12 + 9   ;
     rl. w1     j0.     ;
     al  w1  x1+2       ;   ext := ext + 2;
     rs. w1     j0.     ;
     sh  w1     e4-2    ;   if ext <= max then
     jl.        a0.     ;   goto rep;
     al  w2     10      ;
     am.      (b55.)    ;
     jl  w3    h26-2    ;   outchar(10);
     jl.        a2.     ;   exit;

\f


;kll 3.4.73          init, end          central   ...44a...
j0:              0      ;   ext
j1:  <:<10>externals<0>:>
j2:             20      ;   constant
a2:                     ; exit addr:
z.
     rl. w2     b58.   ;
     rl  w1  x2+f35-f0+8;
     jl. w3     c8.    ;    reserve access(bosstest);
     rl  w1  x2+j26+8  ;
     jl. w3     c8.    ;    reserve access(drumcore);
     rl  w1  x2+f27-f0+8;
     jl. w3     c8.    ;    reserve access(disccore);
     al. w2    (g4.)   ; note: indirect to enable tracing of external references
     rl  w1  x2+286<1  ;
     jl. w3     c8.    ;    reserve access(usercat);
     rl  w1  x2+285<1  ;
     jl. w3     c8.    ;    reserve access(catalog);
     sp         66     ;    if monitor mode then
     sp.        0      ;
     jl.        4      ;
     jl.        a3.    ;      begin
     rl  w3     66     ;
     jd.        2      ;      disable during name change;
     dl. w1     j3.+2  ;    process name:= boss;
     ds  w1  x3+4      ;
     dl. w1     j3.+6  ;
     ds  w1  x3+8      ;
     je.        2      ;

c. e16  ;  if monitor mode not wanted then remove monitor mode:
c.-e80
     al. w1     m0.    ;      w1:= mess addr;
     al. w3     j3.    ;      w3:= addr of <:boss:>;
     jd         1<11+16;      send message to own process;

     rl  w3     66     ;      w3:=proc descr addr;
     rl. w1     b47.   ;      w1:=last of boss own core;
     al  w1  x1+2      ;      correct for dummy word;
     rs. w1     a5.    ;      save limit;
     ws  w1  x3+22     ;      w1:=(last-first) of boss core;
     al  w0     0      ;
     wd. w1     j4.    ;      w0:=remainder(w1 divided by 4);
     ws. w0     j4.    ;      w0:=remainder - 4;
     al  w1  x2        ;
     ws  w1     0      ;      w1:=buf addr + 2 + 4 - remainder;
     rl  w2  x3+22     ;
     wa  w2     0      ;      w2:=first boss core + remainder - 4;
     am.       (g4.)   ; note: indirect to enable tracing of external references;
     rl  w0    -11<1   ;      w0:=ext(-11); (i.e. pk);

     jl  w1  x1+8-2    ;      jump to message (rel: 4 - remainder);
a5:             b47+2  ;+2    last boss core addr;
; at return from the procedure the protection key of whole boss core is changed,
; but the registers may have their old pk.  therefore :
     al. w1    ; here  ;      call some proc func procedure
     al. w3    ; here  ;      in order to force pk-change
     jd         1<11+40;      of working registers;


; now boss is running in normal task mode;
     al  w2  x2-16-8   ;      w2:=buffer address;
     jd         1<11+82;      regret message;
z.
z.
c.e80
     rl  w3     66     ;    w3:=own process description
     dl  w1  x3+24     ;    w01:=own core limit
     rl  w2  x3+100    ;    w2:=lower write limit
     se  w0  x2        ;    if lower write limit < first core then
     ds  w1  x3+102    ;    set limit registers
z.

a3:  am.        (b58.) ;      end;
     jl         d12-f0 ; goto wait;
e.                     ;

\f


; rc 11.01.72          init, alarms          central ...45...

c12: ds. w1     a16.   ; init trouble:
     jl.        a2.    ; alarm:= a22;
c13: ds. w1     a16.   ;
     jl.        a3.    ; alarm:= a23;
c14: ds. w1     a16.   ;
     jl.        a4.    ; alarm:= a24;
c15: ds. w1     a16.   ;
     jl.        a5.    ; alarm:= a25;
c16: ds. w1     a16.   ; 
     jl.        a6.    ; alarm:= a26;
c17: ds. w1     a16.   ;
     jl.        a7.    ; alarm:= a27;
c18: ds. w1     a16.   ;
     jl.        a8.    ; alarm:= a28;
c19: ds. w1     a16.   ;
     jl.        a9.    ; alarm:= a29;
c20: ds. w1     a16.   ;
     jl.        a10.   ; alarm:= a30;
c21: ds. w1     a16.   ;
     jl.        a11.   ; alarm:= a31;
c22: ds. w1     a16.   ;
     jl.        a14.   ; alarm:=a32;
c23: ds. w1     a16.   ;
     jl.        a1.    ; alarm := a33;
c24: ds. w1     a16.   ;
     jl.        a19.   ; alarm:=a34;
a2:  am         a21    ;
a3:  am         a21    ;
a4:  am         a21    ;
a5:  am         a21    ;
a6:  am         a21    ;
a7:  am         a21    ;
a8:  am         a21    ;
a9:  am         a21    ;
a10: am         a21    ;
a14: am         a21    ;
a1:  am         a21    ;
a19: am         a21    ;
a11: al. w0     a31.   ;
d27:                   ; init alarm:   w0 = text addr; text = 11 words exactly.
     ds. w3     a18.   ;
c.e7,am.     (b55.)    ; if fp mode then
     jl  w3  h31-2  z. ;   outtext(alarm)
c.-e7,al w1  a20       ; else
     wa  w1  0         ;  begin
     ds. w1  b42.      ;    b41,b42:= addr alarm text;
a12: al. w1  b40.      ;   rep:
     rl. w3  b58.      ;    send message(main console);
     al  w3  x3+j16    ;    if no buffers then
     jd      1<11+16   ;      begin
     se  w2  0         ;        wait event;
     jl.     a13.      ;        get event;
     jd      1<11+24   ;        goto rep;
     jd      1<11+26   ;      end;
     jl.     a12.      ;    wait answer;
a13: jd      1<11+18   ;  end;
z.   dl. w3  a18.      ;
     dl. w1  a16.      ; reestablish registres;
c.-1, o5, z.           ;    (bossfault xref)
     jd        -5      ; alarm;

\f

; rc 26.2.71          init, alarms          central   ...46...


a15: 0, a16: 0, a17: 0, a18: 0   ; saved registers

a22: <:<10>process too small             <10><0>:>
a23: <:<10>corutine area missing         <10><0>:>
a24: <:<10>dummy answer corutine         <10><0>:>
a25: <:<10>transfer error corutine       <10><0>:>
a26: <:<10>max corutine too small        <10><0>:>
a27: <:<10>input error virt core         <10><0>:>
a28: <:<10>output error virt core        <10><0>:>
a29: <:<10>virt core table too small     <10><0>:>
a30: <:<10>create drum core error        <10><0>:>
a32: <:<10>table reservation error       <10><0>:>
a33: <:<10>i116 too small: w0=min value  <10><0>:>
a34: <:<10>external outside limits       <10><0>:>
a31: <:<10>create disc core error        <10><0>:>
a21= a22-a23           ; -length of alarm text
a20= a23-a22-2         ; length of alarm text-2
e.



\f

; rc 10.11.71          init, load list          central   ...47...


b. a9  w.              ;
g0:  <:bterm2:>,0,0,0   ; first corutine file: (5 word entries)
     <:bterm1:>,0,0,0   ; after bterm1 (termout)
     <:bjobstart:>,0,0  ; after bterm1
     <:bjob:>,0,0,0     ;
     <:bmount:>,0,0,0   ;
     <:bread:>,0,0,0    ;
     <:bprinter:>,0,0   ; fills holes
     <:bprocs:>,0,0,0   ; last sender description
     <:bbanker:>,0,0    ; last file. cleans catalog
g1=k-9                   ; lastname+1:
g2:              0      ; next name:

c.-e7
g8:  rl  w3     66     ; move program:
     rl  w3  x3+22     ;    w3:= first of process;
     am        -2000  ;
     rl. w2     b58.+2000;    w2:= first of program;

a1:  dl  w1  x2+2      ;
     ds  w1  x3+2      ;
     al  w2  x2+4      ;    move program to
     al  w3  x3+4      ;    first of process;
     sh. w3     g8.    ;
     jl.        a1.    ;

     ws  w3     4      ;
     am        -2000   ;
     jl.     x3+g9.+2000;    return;
z.


g7:
g4=k+e5
    g5=g4+e4, g6=g5+4     ; start of external table
    g10=g5-b0             ; length of init
    f40=g5 -f0            ; length of resident part+init
    f30=b0-f0             ; length of resident part

; end init code= start ext table+ length of ext table;

e.e.   ; end b-names and j-names
f48=s0, f49=s1         ; final checksum
i.e. ; end c names and g-names
i.e. ; end d-names and f-names
e.   ; end options (i and e-names)
e.e. ; end h-names and dummy block   ; end fp-names
▶EOF◀