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

⟦c9a481430⟧ TextFile

    Length: 168960 (0x29400)
    Types: TextFile
    Names: »tcode«

Derivation

└─⟦00964e8f7⟧ Bits:30007478 RC8000 Dump tape fra HCØ.
    └─⟦b2ec5d50f⟧ 
        └─⟦545a06c52⟧ »tcodeproc« 
            └─⟦this⟧ 

TextFile

lookup codelist
if ok.yes
mode listing.yes list.yes
message anders lindgård
message 1981.01.8
procnames=edit
i"
initcode alarm regretmess checkpda,
unstackcuri starti callcode,
sendmessid lookupentry movetext,
initproc lookupaux waitmessage,
byteload scopepro setcatbase,
changetail,
",f
entrynames=edit
i"
gcdl,
gcd changebase alarmterm,
packtext,
connectcuri unstackcuro connectcuro outendcur incharcur outcharcur closeout,
stopi sendm waitm waitevent getevent testbit moveb,
wordl senda gencopy testevent messadd pda ba from to bytes coreaddr result,
redefarray generaten zonedes releaseproc rstable integerexor exclude include,
lookuptail createentry permentry removeentry careaproc program createper,
movebytes,
reserveproc sendmessage waitanswer getclock description nameentry,
renameentry cpseudoproc,
procidbit monitorproc clearstat permaux,
modifyint createint startint stopint removeproc copyzone includeall,
shortload wordload doubleload bytestore wordstore doublestore firstaddr,
integerand integerneg nameload cleararray setbit integeror,
scopeuser setenbase setbsclaims scopetemp scopelogin,
headandtail reservesegm wait sendanswer owndescr,
",f
rsnames=edit
i"
trapbase lastused console parent,
",f
allnames=edit procnames entrynames rsnames
l b,s2,l b,s3,f
clearall=edit allnames
i"
o lkj
scope temp,
"
l b,l-1,r/,//,s1,i/

clear temp,
/,
l b,l-1,r/,/
o c
/,f
i clearall
\f


message initcode

initcode=set 1 drum
((initcode=slang fpnames type.yes insertproc entry.no
  initcode )
  )


; b.                    ; fpnames dummy block

b. g1,e20               ;   block with names for tails
k=0                     ;   and insertproc.
                       m.initcode

s. g6,j48,d6,f24,i24    ;    start of slang segment for proc.
h.
g0=0                    ;    g0:=no of externals;
e20:
g1:  g2 , g2            ;    headword: rel of last point,
                        ;                rel of last abs word
j4:  g0+4 , 0           ;    RS entry 4, take expression
j6:  g0+6 , 0           ;    RS entry 6, end register expr.
j12: g0+12, 0           ;    RS entry 12, UV
j13: g0+13, 0           ;    RS entry 13, last used
j16: g0+16, 0           ;    RS entry 16, segment table base
j21: g0+21, 0           ;    RS entry 21, general alarm
j29: g0+29, 0           ;    RS entry 29, param alarm
j30: g0+30, 0           ;    RS entry 30, saved stack ref, saved w3
j42: g0+42, 0           ;    RS entry 42, victim

g2=k-2-g1               ;    end of abs word:=end of points;

w.
e0:   g0                ;    start of external list
      0                 ;    number of bytes to initialize
w.    14 01 73, 19 00 00;    date, time
f0:   2.111             ;   mask
f1:   3<12              ;   input message
f4:   0,r.10            ;   tail
f5:   <:<10>claim:>     ;  

; integer procedure init_code(A,name,one or more source parameters);
; <any type> array A; string name; <any type> source;
; init_code:=number of source parameters;
; Loads the array A with a preassembled slang code from the
; backing store area name. All the addresses of source parameters
; are stored in the array, too.

e1:   rl. w2 (j13.)     ;   w2:=last used;
      ds. w3 (j30.)     ;   saved stack ref, saved w3
      dl  w1  x2+8      ;
      jl. w3  d2.       ;   find first address of A
      rs  w1  x2+8      ;

      al  w3  0         ;
      rs  w3  x1+2      ;
      al  w3  x2+6      ;
      ba  w3  x2+4      ;
       rl  w0  x2+10     ;
      sn  w0  24        ;   i:=if short string then 4
      al  w3  x3-4      ;      else 0;
      rs  w3  x2+6      ;   upper limit:=stack ref+appetite+6-i;
      dl  w1  x2+16     ;   take first param
      rs  w3  x2+16     ;
      al  w3  x2+16     ;
      jl.     i3.       ;   goto First param;

i2:   sl  w3 (x2+6)     ; Next:
      jl.     i5.       ;   if cur param>=upper limit then
      dl  w1  x3        ;   goto End source param;
i3:   rs  w3 (x2+8)     ; First param:
      rs  w0  x2+14     ;   save formal1
      so  w0  16        ;   if expr then
      jl. w3 (j4.)      ;   take expression;
      ds. w3 (j30.)     ;   saved stack ref, saved w3
      rl  w0  x2+14     ;
      jl. w3  d2.       ;   addr:=absaddr;
      sl  w1 (x2+6)     ;   if addr<upper limit and
      jl.     i4.       ;   addr>=first param then
      sl  w1  x2+6      ;   upper limit:=addr;
      rs  w1  x2+6      ;

i4:   la. w3  f0.       ;   kind:=kind mod 8;
      sl  w3  3         ;   if kind not of type integer or boolean
      al  w1  x1+1      ;   then make addr odd;
      sh  w1  x2        ;   if addr point to data then
      jl.     6         ;
      sh  w1 (x2+16)    ;   make addr negative;
      ac  w1  x1        ;
      am     (x2+8)     ;
      rl  w3  2         ;
      am     (x2+8)     ;
      rs  w1  x3+10     ;   A.pointer:=addr;
      al  w3  x3+2      ;   pointer:=pointer+2;
      am     (x2+8)     ;
      rs  w3  2         ;
      rl  w3 (x2+8)     ;
      al  w3  x3+4      ;   cur param:=cur param+4;
      jl.     i2.       ;   goto Next;

i5:   rl  w3  x2+8      ; End source param:
      rl  w1  x3+2      ;
      rs  w1  x3+4      ;   A(2):=appetite of source param;
      rs  w1  x2+16     ;
      wa  w3  2         ;   first addr of data:=
      al  w3  x3+8      ;   last addr of param in A;
      rs  w3 (x2+8)     ;
      al  w3  0         ;

i7:   rs  w3  x2+14     ; Nextaddr:
      am     (x2+8)     ;
      rl  w0  x3+10     ;   addr:=saved addr in A;
      sl  w0  0         ;   if addr>=0 then
      jl.     i10.      ;   goto Positive;
      ac  w0 (0)        ;   addr:=-addr;
      rl  w1 (x2+8)     ;
      sz  w0  1         ;   if addr points to long data then
      jl.     i8.       ;   goto Long;
      al  w1  x1+2      ;   update first addr of data
      rl  w0 (0)        ;   move short data
      rs  w0  x1        ;
      jl.     i9.       ;   goto Save;

i8:   al  w1  x1+4      ; Long:
      dl  w0 (0)        ;   update first addr of data
      ds  w0  x1        ;   move long data

i9:   rs  w1 (x2+8)     ; Save:
      jl.     i11.      ;   goto Correctaddr;

i10:  rl  w1  0         ; Positive:
      sz  w1  1         ;   if addr of type real or long then
      al  w1  x1-1      ;   set addr to third byte in the doubleword;

i11:  rl  w3  x2+14     ; Correctaddr:
      am     (x2+8)     ;
      rs  w1  x3+10     ;   set correct addr in A
      al  w3  x3+2      ;
      se  w3 (x2+16)    ;   if more param then
      jl.     i7.       ;   goto Nextaddr;

      dl  w1  x2+12     ;   take param: name
      so  w0  16        ;   if expr then
      jl. w3 (j4.)      ;   take expression;
      ds. w3 (j30.)     ;   saved stack ref, saved w3
      al  w2  x2+10     ;
      jl. w3  d0.       ;   w3:=takestring(name);
      al  w2  x2-10     ;
      al. w1  f4.       ;   w1:=tail address;
      jd  1<11+42       ;   lookup entry
      sn  w0  0         ;
      jl.     i14.      ;   if result>0 then

i13:  rl  w1  0         ; Error:
      al  w0  x3        ;   alarm(string name,result);
      jl. w3 (j21.)     ;

i14:  jd  1<11+52       ;   create area process
      se  w0  0         ;   if result>0 then
      jl.     i13.      ;   goto Error;
      rs. w0  f1.+6     ;
      rl  w1 (x2+8)     ;   first addr:=first addr of A
      al  w0  x1+2      ;
      wa. w1  f4.+18    ;               to use of code;
      al  w1  x1+512    ;   last addr:=length+510+first addr;
      ds. w1  f1.+4     ;

      ws  w0  x2+8      ;   save bytes used
      rs. w0 (j12.)     ;

      rl  w2  x2+8      ;
      bl. w1  f4.+17    ;   A(1):=absolute address of the
      al  w1  x1+2      ;         first instruction to
      wa  w1  x2        ;         execute;
      rs  w1  x2+2      ;

      rl. w1  j42.      ;
      rl  w0  x1+32     ;   A(3):=RS base; (victim)
      rx  w1  0         ;
                        ;   A(4):=FP base; (core base)
      ds  w1  x2+8      ;

      al. w1  f1.       ;   w1:=message address;
      jd  1<11+16       ;   send message
      se  w2  0         ;   if buffer claim exceeded then
      jl.     i17.      ;   alarm(<:claim:>,0);
      al. w0  f5.       ;
      al  w1  0         ;
      jl. w3 (j21.)     ;

i17:  al. w1  f4.       ;   w1:=answer address;
      jd  1<11+18       ;   wait answer
      sn  w0  1         ;   if result>1 then
      jl.     i18.      ;   alarm(<:claim:>,result);
      al. w3  f5.       ; 
      jl.     i13.      ;
i18:  jd  1<11+64       ;   remove process

      rl. w1 (j12.)     ;   initcode:=bytes used;
      jl.    (j6.)      ;   end register expr.


; integer procedure absaddr;
; Finds the address of a variable or the first
; address of an array. A zone is treated as a real array.
;         at entry    at return
; w0      formal1     destroyed
; w1      formal2     abs address
; w2      not used    unchanged
; w3      link        kind

b. b6,w.

b0:   0                 ;   link
b1:   0                 ;   formal2
d2:   rs. w3  b0.       ;   save link
      rs. w1  b1.       ;   save formal2
      al  w3  2.11111   ;
      la  w3  0         ;   kind:=formal1 extract 5;
      sn  w3  23        ;   if kind=zone then
      al  w3  19        ;   kind:=real array;
      sl  w3  16        ;   if kind<16
      sl  w3  23        ;   or kind>22 then
      jl.     b2.       ;   begin
                        ;    absaddr:=addr(variable);
                        ;   end else
      ba  w1  0         ;   begin
      rl  w1  x1        ;    w1:=abs dope addr;
      wa. w1 (b1.)      ;    w1:=lower index-1; (even)
      am      2         ;    absaddr:=abs addr of first element;

b2:   al  w1  x1-1      ;
      jl.    (b0.)      ;   end;
e.                      ;   return


; procedure take string;
; registers  at entry                 at return
;   w0       not used                 destroyed
;   w1       abs addr of string/elem  destroyed
;   w2       addr of first formal     unchanged
;   w3       link                     addr of start of name
b. a8,c6,b24            ; begin
w.
c0: 0, c1: 0            ;   first formal,link
c2:   0,r.5             ;   name
c3:   0                 ;   work
c4:   0                 ;   work
d0:                 ;entry get string
     ds. w3  c1.    ;save link , save w2
     rl  w0  x2     ;w0:=first formal
     al  w3  2.11111;
     la  w3  0      ;w3:=kind+()
     se  w3  10     ;if integer expression
     sn  w3  26     ;or integer then
      jl. w3 (j29.)  ;   param alarm;
     se  w3  24     ;if -,string variable or
     sn  w3  8      ;-,string expression
     jl.     a1.    ;begin comment array;
     sh  w3  22     ;if variable or
     sh  w3  15     ;procedure or expression then
     jl. w3 (j29.)  ;param alarm
     ba  w1  0      ;w1:=abs dope addr
     rl  w3  x1     ;w3:=lower index-K (K=2)
     wa  w3 (x2+2)  ;w3:=first addr-2
     al  w3  x3+2   ;w3:=first addr
     jl.    (c1.)   ;end;
a1: 
     dl  w1  x1     ;w1w0:=string value
     sh  w0  0      ;if layout then
     jl. w3 (j29.)  ;param alarm
     sh  w1  -1     ;if long string then
     jl.     a3.    ;goto long string
     al. w3  c2.    ;w3:=name addr
     ds  w1  x3+2   ;store string value
     ld  w1 -65     ;w1w0:=0;
     ds  w1  x3+6   ;last part name:=0;
     jl.    (c1.)   ;end get string
a3:                 ;long string:
     ds. w1  c4.    ;store item
     ld  w1 -65     ;w1w0:=0
     ds. w1  c2.+6  ;name(3):=name(4):=0;
     rl. w0  c1.    ;w0:=return addr
     al. w3  a7.    ;w3:=exit addr
     ws  w0  6      ;w0:=rel return adr
     rs. w0 (j12.)  ;save rel return in UV
     dl. w1  c4.    ;w1w0:=item
a4:                 ;find first part:
     bz  w3  0      ;w3:=rel segm no
     ls  w3  1      ;w3:=w3*2
     wa. w3 (j16.)  ;w3:=segment addr
     rl  w3  x3     ;w3:=first addr(segment);
     bz  w0  1      ;w0:=rel
     wa  w3  0      ;w3:=segment+rel
     dl  w1  x3     ;w1:=item (ref out of this segment)
     sh  w1  -1     ;if long string then goto long string
     jl.     a4.    ;goto long string
     ds  w1  x2+2   ;save first part
     al  w3  x3-4   ;x3:=addr next
a5:  dl  w1  x3     ;take next: (ref out of this segment?)
     sh  w1  -1     ;if long string then
     jl.     a6.    ;goto next long
     al. w3  c2.    ;w3:=name addr
     ds  w1  x3+6   ;name 3,4:=second part
     dl  w1  x2+2   ;w1w0:=first part
     ds  w1  x3+2   ;name 1,2:=first part
     rl. w1 (j12.)  ;w1:=rel return addr
a7:  jl.     x1+0   ;return
a6:                 ;long string second item
     bz  w3  0      ;w3:=rel segm no
     ls  w3  1      ;w3:=w3*2
     wa. w3 (j16.)  ;w3:=segment
     rl  w3  x3     ;w3:=first addr(segment);
     bz  w0  1      ;w0:=rel
     wa  w3  0      ;w3:=addr second item
     jl.     a5.    ;goto take second
e.                      ; end take string;


m.   end code of this segment
h.    0,r.(:504-k:)     ;    fill up the segment
w.    <:initcode   <0>:>;    alarm text

e.                      ;    end slang segment

w.


; initcode:
g1:
g0:   1                 ;    first tail: area with 1 segment
      0,0,0,0           ;    fill
      1<23+e1-e20       ;    entry point initcode
      3<18+40<12+41<6+41,0;    integer procedure(undef,undef,general addr);
      4<12+e0-e20       ;    code proc , start of external
      1<12+00           ;    1 code segment , bytes in perm. core

n.
\f


message regretmess
(regretmess=set 1
(regretmess=slang fpnames type.yes insertproc entry.no
 regretmess gcdl  )
if ok.no
 end
)


; HCØ  30 04 1974.

; b.                    ;   fpnames dummy block

b. g1,e20               ;   block with names for tails
k=0                     ;   and insertproc.

s. g2,j64,d2            ;   start of slang segment for proc.
h.
g0=0                    ;   g0:=no of externals;
e20:
g1:   g2   , g2         ;   headword: rel of last point,
                        ;             rel of last abs word
j3:   g0+ 3, 0          ;   RS entry  3, reserve
j4:   g0+ 4, 0          ;   RS entry  4, take expression
j6:   g0+ 6, 0          ;   RS entry  6, end  register expr
j8:   g0+8 , 0          ;   RS entry  8, end addres expression
j13:  g0+13, 0          ;   RS entry 13, last used
j30:  g0+30, 0          ;   RS entry 30, saved stack ref, saved w3
j42:  g0+42, 0          ;   RS entry 42, victim (start of RS-table)

g2=k-2-g1               ;   end of abs word:=end of points;

w.
e0:   g0                ;   start of external list:
       0                ;   number of bytes to initialize
      16 02 76,12 00 00 ;   date and time of this version

; integer procedure regretmess(buf);
; address integer buf;
; regretmess:=result of monitor procedure regret message

e1:   rl. w2 (j13.)     ;   w2:=last used;
      ds. w3 (j30.)     ;   saved stack ref, saved w3
      dl  w1  x2+8      ;   take formals: buf
      so  w0  16        ;   if expression then
      jl. w3 (j4.)      ;   take expression;
      rl  w2  x1        ;
      jd  1<11+82       ;   regret message
      jl.    (j8.)      ;   end address expr.

; long procedure gcdl(u,v);
; This algorithm finds the greatest common divisor
; of the two longs u and v.
; Special cases:
;    gcdl(0,0) = 0
;    gcdl(u,0) = abs u
b. i24, w.              ; begin
      0, i0: 0          ;   u
      0, i1: 0          ;   v
      0, i2: 1          ;   long constant
i3:   -1                ;
i4:   0                 ;   p

e2:   rl. w2 (j13.)     ;   w2:=last used;
      ds. w3 (j30.)     ;   saved stack ref, saved w3
      dl  w1  x2+8      ;   take formals: u
      so  w0  16        ;   if expr then
      jl. w3 (j4.)      ;   take expression;
      rs  w1  x2+8      ;
      dl  w1  x2+12     ;   take formals: v
      so  w0  16        ;   if expr then
      jl. w3 (j4.)      ;   take expression;
      ds. w3 (j30.)     ;   saved stack ref, saved w3

      dl  w0  x1        ;
      sl  w3  0         ;   if v<0 then
      jl.     8         ;   v:=-v;
      lx. w0  i3.       ;
      lx. w3  i3.       ;
      aa. w0  i2.       ;
      ds. w0  i1.       ;

      dl  w0 (x2+8)     ;
      sl  w3  0         ;   if u<0 then
      jl.     8         ;   u:=-u;
      lx. w0  i3.       ;
      lx. w3  i3.       ;
      aa. w0  i2.       ;
      ds. w0  i0.       ;

      lo  w0  6         ;
      sn  w0  0         ;
      jl.     i6.       ;   if u>0
      dl. w0  i1.       ;   and v>0 then
      lo  w0  6         ;   goto Power of 2;
      se  w0  0         ;
      jl.     i8.       ;

      am     -4         ; Special cases:
i6:   dl. w1  i1.       ;   gcdl:=if u=0 then v else u;
      jl.    (j6.)      ;   end register expression

i8:   al  w1  0         ; Power of 2:
      rs. w1  i4.       ;
      dl. w0  i0.       ;
      dl. w2  i1.       ;

i10:  sz  w0  1         ;
      jl.     i12.      ;   for p:=0, p+1 while
      sz  w2  1         ;             u is even  and
      jl.     i14.      ;             v is even  do
      rx. w1  i4.       ;       begin
      al  w1  x1+1      ;        u:=u/2;
      rx. w1  i4.       ;        v:=v/2;
      ld  w0 -1         ;       end;
      ld  w2 -1         ;   p:=p-1;
      ds. w0  i0.       ;
      ds. w2  i1.       ;
      jl.     i10.      ;

i12:  lx. w1  i3.       ;
      lx. w2  i3.       ;   t:=if u is odd then -v
      dl. w0  i2.       ;                  else u;
      aa  w0  4         ;

i14:  sz  w0  1         ; Check t:
      jl.     i18.      ;   if t is odd then goto Reset;

i16:  ad  w0 -1         ; Halve t:
      jl.     i14.      ;    goto Check t;

i18:  sl  w3  1         ; Reset:
      jl.     i19.      ;
      sn  w3  0         ;
      sn  w0  0         ;
      jl.     i20.      ;   if t>0 then
i19:  ds. w0  i0.       ;   u:=t else
      jl.     i22.      ;   v:=-t;
i20:  lx. w3  i3.       ;
      lx. w0  i3.       ;
      aa. w0  i2.       ;
      ds. w0  i1.       ;

i22:  dl. w0  i0.       ; Sub:
      ss. w0  i1.       ;   t:=u-v;
      sn  w3  0         ;
      se  w0  0         ;   if t<>0 then
      jl.     i16.      ;   goto Halve t;

      dl. w1  i0.       ;
      ld. w1 (i4.)      ;   gcdl:=u* 2**p;
      jl.    (j6.)      ;   end register expr.
e.                      ; end gcdl;
c.-1


; integer procedure calledfrom(skip);
; address integer skip;
; The stack is unwinded skip times. If the corresponding segment
; to this point of stack is not a main algol segment then lower
; line becomes negative.
; calledfrom:=lower line;
; skip:=-upper line;
b. i36, w.              ; begin
i0:   0                 ;   first of prg.; upper line
i1:   0                 ;   stack bottom;  inf1
i2:   31                ;   mask: last 5 bits
i3:   3                 ;   mask: last 2 bits
i5:   0                 ;   current last used
      0                 ;   current stack ref
      0                 ;   current segment
      0                 ;   current app, rel

e3:   rl. w2 (j13.)     ;   w2:=last used;
      ds. w3 (j30.)     ;   saved stack ref, saved w3
      dl  w1  x2+8      ;   take formals
      so  w0  16        ;   if expr then
      jl. w3 (j4.)      ;   take expression;
      ds. w3 (j30.)     ;   saved stack ref, saved w3
      rs  w1  x2+8      ;

      rl  w1  x1        ;
      la. w1  i2.       ;
      rl. w3  j42.      ;
      rl  w0  x3+46     ;
      rl  w3  x3+66     ;   save first of prg. and stack bottom
      ds. w0  i1.       ;

      rl  w3  x2        ;
      ds. w3  i5.+2     ;   save cur last used and cur sref
      dl  w0  x2+4      ;
      ds. w0  i5.+6     ;   save return point;

i6:   sn  w1  0         ;   for k:=upper step -1 until 0 do
      jl.     i8.       ;   unwind;
      jl. w3  i24.      ;
      al  w1  x1-1      ;
      jl.     i6.       ;

i7:   al  w1  0         ; Set zero:
      rs. w1  i0.       ;   upper line:=lower line:=0;
      jl.     i18.      ;   goto Lower found;

i8:   rl. w3 (i5.+4)    ; Find line interval:
      rl. w0  i5.+6     ;
      hs. w0  i13.      ;   relsegm:=rel of return point;
      rl  w1  x3+504    ;
      ls  w1 -11        ;   upper line:=first line_inf shift (-11);
      rs. w1  i0.       ;
      dl  w1  x3+510    ;
      rl. w2  i3.       ;
      la  w2  2         ;   save segment type
      hs. w2  i19.      ;
      al  w2  512       ;   rel:=512;
      ld  w1 -3         ;   inf:=last line_inf shift (-3);

i12:  rs. w1  i1.       ; Rep:
      la. w1  i2.       ;   inf1:=inf extract 24;
      sn  w1  31        ;   if inf1 extract 5 = 31 then
      jl.     i16.      ;   goto Lower on previous segment;
      ac  w1  x1        ;
      wa. w1  i0.       ;   upper line:=upper line - inf1 extract 5;
      rs. w1  i0.       ;
      al  w2  x2-32     ;   rel:=rel-32;
i13=k+1
      sh  w2  0 ; Note  ;   if rel<=relsegm then
      jl.     i18.      ;   goto Lower found;
      rl. w1  i1.       ;
      ld  w1 -5         ;   inf:=inf shift (-5);
      sn  w2  512-9*32  ;   if rel=limit for last line_inf then
      dl  w1  x3+506    ;   inf:=first line_inf;
      jl.     i12.      ;   goto Rep;

i16:  rl  w0  x3+510    ; Lower on previous segment:
      al  w1  1         ;   lower line:=1;
      sz  w0  4         ;   if segment type = first segment then
      jl.     i18.      ;   goto Lower found;
      rl. w3  i5.+4     ;
      rl  w3  x3-2      ;   lower line:=prev segment.first line_inf
      rl  w1  x3+504    ;               shift (-11);
      ls  w1 -11        ;

i18:  rl. w2 (j13.)     ; Lower found:
      ac. w0 (i0.)      ;
      rs  w0 (x2+8)     ;   upper:=-upper line;
i19=k+1
      am      0 ; Note  ;
      se  w1  x1-2      ;   if segment type <> algol then
      ac  w1  x1        ;   lower line:=-lower line;
      jl.    (j6.)      ;   calledfrom:=lower line;
                        ;   end register expr

; procedure unwind;
i22:  0,0               ;   w3, w1
i24:  rs. w3  i22.      ;   save w3
      rs. w1  i22.+2    ;   save w1

      rl. w3 (i5.+4)    ;   k:=segment table(cur last used+2);
      rl  w0  x3+510    ;   segment type:=segment.k.last two bits;
      la. w0  i3.       ;
      sh  w0  2         ;   if segment type <> algol then
      sh  w0  0         ;   goto Unwind call;
      jl.     i32.      ;

      rl. w1  i5.+2     ;
i28:  sh. w1 (i1.)      ; Next:  if cur sref > stack bottom
      sh. w1 (i0.)      ;        or cur sref <= first of prg. then
      jl.     i30.      ;        goto Unwind thunk;

      rl  w0  x1-2      ;
      am.    (i5.)      ;   if last used in block > cur last used then
      sl  w0  1         ;   goto Unwind thunk;
      jl.     i30.      ;

      rs. w1  i5.       ; Unwind block:
      sl. w1 (i1.)      ;   current last used:=current stack ref;
      jl.     i7.       ;   if cur sref >= stack bottom then
                        ;   goto Set zero;
      am     (x1-4)     ;
      rl  w1  x1+2      ;   current stack ref:=word(blockno.+2);
      jl.     i28.      ;   goto Next;

i30:  am     -2         ; Unwind thunk:  k:=cur last used;
i32:  rl. w1  i5.+2     ; Unwind call:   k:=cur stack ref;
      bl  w3  x1+4      ;
      al  w3  x3+6      ;
      wa  w3  2         ;   cur last used:=k + appetite + 6;
      rs. w3  i5.       ;
      dl  w0  x1+4      ;   save cur segment and cur app, rel
      ds. w0  i5.+6     ;
      rl  w1  x1        ;
      rs. w1  i5.+2     ;   cur stack ref:=sref of return point;

      rl. w1  i22.+2    ;   restore w1
      jl.    (i22.)     ;   return;
e.                      ; end calledfrom;
z.



m.   end code of this segment
h.    0,r.(:504-k:)     ;   fill up the segment
w.    <:monproc    <0>:>;   alarm text

e.                      ;   end slang segment

w.

; regretmess:
g0:   1                 ;   first tail: area with 1 segment
      0,0,0,0           ;   fill
      1<23+e1-e20       ;   entry point regretmess
      3<18+19<12,0      ;   integer procedure(addr integer);
      4<12+e0-e20       ;   code proc, start of external list
      1<12+14           ;   1 code segment, bytes in perm core

; gcdl:
g1:   1<23+4            ;   modekind=backing store
      0,0,0,0           ;   fill
      1<23+e2-e20       ;   entry point gcdl
      5<18+21<12+21<6,0 ;   long procedure(addr long, addr long);
      4<12+e0-e20       ;   code proc, start of external list
      1<12+14           ;   1 code segment, bytes in perm core
c.-1

; calledfrom:
g1:     1<23+4          ;   modekind=backing store
      0,0,0,0           ;   fill
      1<23+e3-e20       ;   entry point calledfrom
      3<18+19<12,0      ;   integer procedure(addr integer);
      4<12+e0-e20       ;   code proc, start of external list
      1<12+14           ;   1 code segment, bytes in perm core
z.

n.
\f


message alarm
(alarm=set 1
(alarm=slang fpnames type.yes insertproc entry.no
  alarm gcd changebase alarmterm  )

 if ok.no
 end
 )

; HCØ 1980-10-10

; b.                    ;   fpnames dummy block

b. g1,e20               ;   block with names for tails
k=0                     ;   and insertproc.

s. g12,j64,b18,d2,f12   ;   start of slang segment for proc.
   i24                  ;
h.
g0=1                    ;   g0:=no of externals;
e20:
g1:   g2   , g2         ;   headword: rel of last point,
                        ;             rel of last abs word
j3:   g0+ 3, 0          ;   RS entry  3, reserve
j4:   g0+ 4, 0          ;   RS entry  4, take expression
j6:   g0+ 6, 0          ;   RS entry  6, end  register expr
j8:   g0+ 8, 0          ;   RS entry  8, end address expr
j12:  g0+12, 0          ;   RS entry 12, UV
j13:  g0+13, 0          ;   RS entry 13, last used
j16:  g0+16, 0          ;   RS entry 16, segment table base
j21:  g0+21, 0          ;   RS entry 21, general alarm
j24:  g0+24, 0          ;   RS entry 24, blocksread
j27:  g0+27, 0          ;   RS entry 27, zone out
j29:  g0+29, 0          ;   RS entry 29, param alarm
j30:  g0+30, 0          ;   RS entry 30, saved stack ref, saved w3
j42:  g0+42, 0          ;   RS entry 42, victim
j48:      0, 11         ;   start of stack chain: 8 bytes in perm core
j49:      1, g7         ;   write, first ext., chain for rel point
j50:      0, 1          ;   alarmterm

g2=k-2-g1               ;   end of abs word:=end of points;

w.
e0:   g0                ;   start of external list:
       2                ;   number of bytes to initialize

      0                 ;   alarmterm
w.

      <:write:>,0,0     ;   name
      3<18+40<12+8<6,0  ;   integer procedure(zone,general address);

      02 03 80, 15 00 00;   date and time of this version

; Constants:
f3:   6<12+23           ; zone formal
      <:<10>:>
f9:   4<12+0            ; appetite increment
f10:  <:<10>***alarm:>  ;

; procedure alarm(source);
; general address source;
; The procedure works as if a call of write(out,source) and
; after this a call of the running system procedure
; general alarm has been called.
b. i12, w.              ; begin
i0:   0                 ;   new stack top
e2:   rl. w2 (j13.)     ;   w2:=last used;
      ds. w3 (j30.)     ;   saved stack ref, saved w3
      rl. w0 (j50.)     ;   
      sn  w0  2         ;   if alarmterm = 2 then
      jl.    (j8.)      ;   end address expression;
      al  w1 -4         ; 
      jl. w3 (j3.)      ;   reserve 4 bytes in stack
      rs. w1  i0.       ;   save new stack top
      rl. w1  j42.      ;
      rl  w1  x1+32     ;
      rl  w0  x2+4      ;
      rs  w0  x1+6      ;   save old return information
      dl  w0  x2+2      ;
      ds  w0  x1+4      ;
      rl. w1  i0.       ;
      rl. w0  g1.       ;   
      rl  w3  x2        ;
      ds  w0  x1+2      ;   set return information
      rl  w0  x2+4      ;
      wa. w0  f9.       ;
      al  w3  g10       ;
      hs  w3  1         ;
      rs  w0  x1+4      ;
      rl. w0  j27.      ;
      rl. w3  f3.       ;
      ds  w0  x1+8      ;
      rl. w3 (j49.)     ;   w3:=segment table(write);
g7=k+1-g1
g9=k+1-g1
      jl      x3        ;   goto write and    ; chain stops
g10=k-g1                ; Return to here:
      rl. w2 (j13.)     ;   w2:=last used;
      ds. w3 (j30.)     ;   saved stack ref, saved w3
      al  w1 -6         ;
      jl. w3 (j3.)      ;   reserve 6 bytes in stack 
      rl. w2  j42.      ;
      rl  w2  x2+32     ;
      dl  w0  x2+4      ;   restore old return
      ds  w0  x1+2      ;
      bz  w0  x2+7      ;
      rs  w0  x1+4      ;
      ds. w2 (j30.)     ;

      rl. w0 (j50.)     ;
      sn  w0  1         ;   if alarmterm = 1 then
      jl.    (j8.)      ;   end address expression;

      al. w0  f10.      ;
      rl. w1 (j24.)     ;
      jl. w3 (j21.)     ;   general alarm
e.                      ; end alarm;

; integer procedure gcd(u,v);
; This algorithm finds the greatest common divisor
; of the two integers u and v.
; Special cases:
;    gcd(0,0) = 0
;    gcd(u,0) = abs u
b. i24, w.              ; begin
e3:   rl. w2 (j13.)     ;   w2:=last used;
      ds. w3 (j30.)     ;   saved stack ref, saved w3
      dl  w1  x2+8      ;   take formals: u
      so  w0  16        ;   if expr then
      jl. w3 (j4.)      ;   take expression;
      rs  w1  x2+8      ;
      dl  w1  x2+12     ;   take formals: v
      so  w0  16        ;   if expr then
      jl. w3 (j4.)      ;   take expression;
      ds. w3 (j30.)     ;   saved stack ref, saved w3
     
      rl  w3  x1        ;
      rl  w2 (x2+8)     ;
      sh  w2 -1         ;   if u<0 then
      ac  w2  x2        ;   u:=-u;
      sh  w3 -1         ;   if v<0 then
      ac  w3  x3        ;   v:=-v;
      sn  w2  0         ;   if u>0
      jl.     i2.       ;   and v>0 then
      se  w3  0         ;   goto Power of 2;
      jl.     i4.       ;

      am     -2         ; Special cases:
i2:   rl  w1  6         ;   gcd:=if u=0 then v else u;
      jl.    (j6.)      ;   end register expr.

i4:   al  w1  0         ; Power of 2:
i6:   sz  w2  1         ;
      jl.     i8.       ;
      sz  w3  1         ;   for p:=0,p+1 while
      jl.     i10.      ;          u is even and
      al  w1  x1+1      ;          v is even do
      ls  w2 -1         ;   begin u:=u/2; v:=v/2; end;
      ls  w3 -1         ;   p:=p-1;
      jl.     i6.       ;

i8:   ac  w0  x3        ;   if u is odd then
      jl.     i12.      ;   t:=-v else t:=u;
i10:  al  w0  x2        ;
i12:  sz  w0  1         ; Check t:
      jl.     i14.      ;   if t is odd then goto Reset;

i13:  as  w0 -1         ; Halve t:  t:=t/2;
      jl.     i12.      ;   goto Check t;

i14:  sh  w0  0         ; Reset:
      jl.     i16.      ;   if t>0 then
      rl  w2  0         ;   u:=t else
      jl.     i18.      ;   v:=-t;
i16:  ac  w3 (0)        ;

i18:  al  w0  x2        ; Sub:
      ws  w0  6         ;   t:=u-v;
      se  w0  0         ;   if t<>0 then
      jl.     i13.      ;   goto Halve t;
      ls  w2  x1        ;
      al  w1  x2        ;   gcd:=u*2**p;
      jl.    (j6.)      ;   end register expr.
e.                      ; end gcd;

; integer procedure change_base(name,displacement);
; undef name; integer dispalcement;
; Changes the address base of the internal process
; specified by name;
b. i2, w.
e4:                     ; entry change_base
      rl. w2  (j13.)    ; w2:=last used
      ds. w3  (j30.)    ; saved stack ref, saved w3
      dl  w1   x2+12    ; take param displacement
      so  w0   16       ; if expression then
      jl. w3  (j4.)     ; take expression
      ds. w3  (j30.)    ; saved stack ref, save w3
      rs  w1   x2+12    ; save displacement
      dl  w1   x2+8     ; get param name
      so  w0   16       ; if expression then
      jl. w3  (j4.)     ; take expression
      ds. w3  (j30.)    ; saved stack ref, saved w3
      jl. w3   d1.      ; w3:=takestring name
      rl  w1  (x2+6)    ; w1:=displ
      jd  1<11+98       ; change base
      rl  w1   0        ; w1:=result
      jl.     (j6.)     ; end register expression
e.
p.<:takestring:>



m.   end code of this segment
h.    0,r.(:504-k:)     ;   fill up the segment
w.    <:conproc    <0>:>;   alarm text

e.                      ;   end slang segment

w.

; alarm:
g0:      1              ;   modekind=backing store
      0,0,0,0           ;   fill
      1<23+e2-e20       ;   entry point alarm
      1<18+40<12,0      ;   procedure(general address);
      4<12+e0-e20       ;   code proc, start of external list
      1<12+10           ;   1 code segment, bytes in perm core

; gcd:
      1<23+4            ;   modekind=backing store
      0,0,0,0           ;   fill
      1<23+e3-e20       ;   entry point gcd
      3<18+19<12+19<6,0 ;   integer procedure(addr integer, addr integer);
      4<12+e0-e20       ;   code proc, start of external list
      1<12+10           ;   1 code segment, bytes in perm core

; change_base:
       1<23+4           ;   modekind=backing store
       0,0,0,0          ;   fill
       1<23+e4-e20      ;   entry point change_base
       3<18+19<12+41<6,0;   integer procedure(undef, addr integer);
       4<12+e0-e20      ;   code proc, start of external list
       1<12+10          ;   1 code segment, bytes in perm core

; alarmterm:
g1:      1<23+4         ;   modekind=backing store
      0,0,0,0           ;   fill
      1                 ;   byte address in own perm core
      9<18, 0           ;   integer variable
      4<12+e0-e20       ;   code proc, start of external list
      1<12+10           ;   1 code segment, bytes in perm core
n.
\f


message checkpda

(checkpda=set 1

(checkpda=slang fpnames type.yes insertproc entry.no
 checkpda packtext )

if ok.no
end
)




; HCØ  01 03 1973.

; b.                    ;    fpnames dummy block

b. g1,e20               ;    block with names for tails
k=0                     ;    and insertproc

s. g6,j48,b18,d6        ;    start of slang segment for proc.
h.
g0=0                    ;    g0:=no of externals;
e20:
g1:  g2 , g2            ;    headword: rel of last point,
                        ;                rel of last abs word
j3:  g0+3 , 0           ;    RS entry 3, reserve
j4:  g0+4 , 0           ;    RS entry 4, take expression
j6:  g0+6 , 0           ;    RS entry 6, end register expr.
j8:  g0+8 , 0           ;    RS entry 8, end addres expr.
j12: g0+12, 0           ;    RS entry 12, UV
j13: g0+13, 0           ;    RS entry 13, last used
j16: g0+16, 0           ;    RS entry 16, segment table base
j29: g0+29, 0           ;    RS entry 29, param alarm
j30: g0+30, 0           ;    RS entry 30,saved stack ref, saved w3
j42: g0+42, 0           ;   RS entry 42, first of rs-table (victim)

g2=k-2-g1               ;    end of abs word:=end of points;

w.
e0:   g0                ;    start of external list
      0                 ;    number of bytes to initialize
      03 08 73, 16 00 00;    date, time

; boolean procedure check_pda(pda);
; address integer pda;
; It is checked about the pda is a process description
; or not.
w.

b. i6,w.                ; begin
e1:   rl. w2 (j13.)     ;   w2:=last used;
      ds. w3 (j30.)     ;   saved stack ref, saved w3
      dl  w1  x2+8      ;   take param: pda
      so  w0  16        ;   if expr then
      jl. w3 (j4.)      ;   take expression;
      ds. w3 (j30.)     ;   saved stack ref, saved w3
      rl  w0  x1        ;
      al  w1 -1         ;
      rl  w2  72        ;
i2:   sn  w2 (80)       ;   for pd:=first process, next process
      jl.     i4.       ;           while pd<>pda and
      sn  w0 (x2)       ;                 pd<>last process do;
      jl.    (j6.)      ;
      al  w2  x2+2      ;   checkpda:=if pd=pda then true
      jl.     i2.       ;             else false;
i4:   al  w1  0         ;
      jl.    (j6.)      ;   end register expr
e.                      ; end;

; procedure packtext(A,source);
; real array A; general address source;
; Every array is treated as a one-dimensional real array.
; The specified strings are packed into the array in this
; way:
; first string portion A(low+0) and A(low+1),
; second string portion A(low+2) and A(low+3),
; etc.
; At most 12 characters are moved from every string and
; unused elements are cleared.
b. i12, w.              ; begin
e2:   rl. w2 (j13.)     ;   w2:=last used;
      ds. w3 (j30.)     ;   saved stack ref, saved w3
      al  w0  2.11111   ;
      la  w0  x2+6      ;
      sh  w0  22        ;
      sh  w0  15        ;   if not array or zone then
      jl. w3 (j29.)     ;   param alarm;

      rl  w1  x2+8      ;
      ba  w1  x2+6      ;
      rl  w3  x1        ;
      wa  w3 (x2+8)     ;   get absolute addres of
      al  w3  x3+4      ;   the array A
      rs  w3  x2+8      ;
      rl. w3  j42.      ;
      rl  w3  x3+32     ;
      al  w0  x2+6      ;
      ba  w0  x2+4      ;
      rs  w0  x3        ;   upper limit:=stack ref + appetite + 6;
      al  w1  x2+6      ;
      rs  w1  x2+6      ;   cur param:=second param;

i2:   rl  w1  x2+6      ;
      al  w1  x1+4      ;   cur param:=cur param+4;
      rs  w1  x2+6      ;
      rl. w3  j42.      ;
      rl  w3  x3+32     ;
      am   (x3)         ;
      sl  w1  -3        ;   if cur param>=upper limit then
      jl.    (j8.)      ;   end address expression;
      dl  w1  x1+2      ;   take formals
      so  w0  16        ;   if expr then
      jl. w3 (j4.)      ;   take expression;
      ds. w3 (j30.)     ;   saved stack ref, saved w3
      rl. w3  j42.      ;
      rl  w3  x3+32     ;
      sl  w1 (x3)       ;   if abs address<upper limit and
      jl.     i4.       ;   abs address>=first param then
      sl  w1  x2+6      ;   upper limit:=abs address;
      rs  w1  x3        ;
i4:   rl  w2  x2+6      ;   w2:=address of first  formal;
      jl. w3  d0.       ;   take string;
      rl. w2 (j13.)     ;   w2:=last used;
      dl  w1  x3+2      ;   
      ds  w1 (x2+8)     ;   move string to
      dl  w1  x3+6      ;   the array
      am     (x2+8)     ;
      ds  w1  4         ;
      rl  w1  x2+8      ;
      al  w1  x1+8      ;
      rs  w1  x2+8      ;
      jl.     i2.       ;   goto LOOP;
e.                      ; end packtext;
c.-1


; integer procedure cleanbuf(pda);
; The message buffer pool is scanned for message buffers with a 
; sender equal to pda, and then they are regretted.
; The value of pda should either be zero or an internal process
; description address. When zero the current internal process
; is understood.
; The result when positive of cleanbuf is the number of
; unsuccesfully attempt to regret, otherwise when negative pda
; does not descripe an internal process.
; address integer pda;
b. i24, w.              ; begin
i0:   0                 ;
e3:   rl. w2 (j13.)     ;   w2:=last used;
      ds. w3 (j30.)     ;   saved stack ref, saved w3
      dl  w1  x2+8      ;   take formals: pda
      so  w0  16        ;   if expr then
      jl. w3 (j4.)      ;   take expression;
      ds. w3 (j30.)     ;   saved stack ref, saved w3
      rl  w0  x1        ;
      se  w0  0         ;   if pda=0 then
      jl.     i4.       ;   begin
      rl  w0  66        ;    pda:=current internal process;
      jl.     i8.       ;    goto Found;
                        ;   end;
i4:   rl  w1  78        ;
i6:   rl  w3  x1        ; Loop:
      sn  w0  x3        ;   for P:=first internal, next internal
      jl.     i8.       ;          while P<>pda 
      al  w1  x1+2      ;          and P<>last process do;
      se  w1 (80)       ;   if P<>pda then
      jl.     i6.       ;   begin
      al  w1 -1         ;    cleanbuf:=-1;  return;
      jl.    (j6.)      ;   end;

i8:   rl. w1  j42.      ; Found:
      rl  w1  x1+48     ;   sp_buf:=spare mess buf;
      rs. w1  i0.       ;
      rl  w3  0         ;
      rl  w2  86        ;
      al  w1  0         ;   k:=0;

i10:  al  w0  0         ;   for buf:=first message buffer,
      se  w3 (x2+6)     ;              next message buffer
      jl.     i16.      ;              while buf<message pool end do
      se  w3 (66)       ;   if buf.sender=pda then
      jl.     i12.      ;   begin
      sn. w2 (i0.)      ;    if pda<>cur internal process
      jl.     i16.      ;    and buf<>sp_buf then
i12:  jd  1<11+84       ;    begin
      se  w0  0         ;     if regretmessage(buf)<>0 then
      al  w1  x1+1      ;     k:=k+1;
i16:  wa  w2  90        ;    end;
      sl  w2 (88)       ;   end buf;
      jl.    (j6.)      ;   cleanbuf:=k;
      jl.     i10.      ;   end register expression.
e.                      ; end cleanbuf;
z.
p.<:takestring:>


m.   end code of this segment
h.    0,r.(:504-k:)     ;    fill up the segment
w.    <:intproc    <0>:>;    alarm text

e.                      ;    end slang segment

w.


; checkpda:
g0:   1                 ;    first tail: area with 1 segment
      0,0,0,0           ;    fill
      1<23+e1-e20       ;    entry point checkpda
      2<18+19<12,0      ;    boolean procedure(address integer);
      4<12+e0-e20       ;    code proc , start of external
      1<12+00           ;    1 code segment , bytes in perm. core


; packtext:
g1:   1<23+4            ;    modekind=backing store
      0,0,0,0           ;    fill
      1<23+e2-e20       ;    entry point packtext
      1<18+40<12+26<6,0 ;    procedure(real,general address);
      4<12+e0-e20       ;    code proc , start of external
      1<12+00           ;    1 code segment , bytes in perm. core
c.-1


; cleanbuf:
g1:   1<23+4            ;    modekind=backing store
      0,0,0,0           ;    fill
      1<23+e3-e20       ;    entry point cleanbuf
      3<18+19<12+00<6,0 ;    procedure(address integer);
      4<12+e0-e20       ;    code proc , start of external
      1<12+00           ;    1 code segment , bytes in perm. core
z.

n.
\f


\f


message unstackcuri
(unstackcuri=set 1

(unstackcuri=slang fpnames type.yes insertproc entry.no
   unstackcuri  connectcuri unstackcuro, 
 connectcuro outendcur incharcur outcharcur closeout)
if ok.no
end
)


; HCØ  12 02 1973.
; Heinrich Bjerregaard.

; b.                    ;   fpnames dummy block

b. g1,e20               ;   block with names for tails
k=0                     ;   and insertproc.

s. g6,j64,b18,d2,f12,i24;   start of slang segment for proc.
h.
g0=2                    ;   g0:=no of externals;
e20:
g1:   g2   , g2         ;   headword: rel of last point,
                        ;             rel of last abs word
j4:   g0+ 4, 0          ;   RS entry  4, take expression
j6:   g0+ 6, 0          ;   RS entry  6, end  register expr
j8:   g0+ 8, 0          ;   RS entry  8, end address expr
j12:  g0+12, 0          ;   RS entry 12, UV
j13:  g0+13, 0          ;   RS entry 13, last used
j16:  g0+16, 0          ;   RS entry 16, segment table base
j29:  g0+29, 0          ;   RS entry 29, param alarm
j30:  g0+30, 0          ;   RS entry 30, saved stack ref, saved w3
j42:  g0+42, 0          ;   RS entry 42, victim
j48:      0, 1          ;   start of stack chain: 8 bytes in perm core
j49:      1, 0          ;   instacked
j50:      2, 0          ;   outstacked

g2=k-2-g1               ;   end of abs word:=end of points;

w.
e0:   g0                ;   start of external list:
       0                ;   number of bytes to initilise
w.    <:instacked:>,0   ;
      9<18,0            ;
      <:outstacked:>    ;
      9<18,0            ;

      12 02 73, 15 00 00;   date and time of this version

; Constants:

f8:   8.377<16




; procedure stackcuri and connectcuri;
; Makes a  FP-call as descriped in the fp-
; manual.

e2:   rl. w2 (j13.)     ;   w2:=last used;
      ds. w3 (j30.)     ;   saved stack ref, saved w3
      am.    (j42.)     ;
      am     (32)       ;
      jl  w3  h29-4     ;   stack current input
      jl.     e4.       ;   end addresss expr

; procedure unstackcuri;
; Makes a fp-call as descriped in the fp-
; manual.

e3:   rl. w2 (j13.)     ;   w2:=last used;
      ds. w3 (j30.)     ;   saved stack ref, saved w3
      rl. w2  j42.      ;
      rl  w2  x2+32     ;
      jl  w3  x2+h79-4  ;   terminate current input
      jl  w3  x2+h30-4  ;   unstack current input
      rl. w3  (j49.)    ;
      al  w3  x3-1      ;instacked:=instacked-1
      rs. w3   (j49.)   ;
      jl.    (j8.)      ;   end address expr

; integer procedure connectcuri(name);
; connectcuri:=status;
; Makes a fp-call as descriped in the fp-
; manual.

e4:   rl. w2 (j13.)     ;   w2:=last used;
      ds. w3 (j30.)     ;   saved stack ref, saved w3
      dl  w1  x2+8      ;   take param: name
      so  w0  16        ;   if expr then
      jl. w3 (j4.)      ;   take expression;
      ds. w3 (j30.)     ;   saved stack ref, saved w3
      jl. w3  d1.       ;   w3:=takestring1(name);
      al  w2  x3        ;   w2:=address of name;
      am.    (j42.)     ;
      am     (32)       ;
      jl  w3  h27-2     ;   connect current input
      rl  w1  0         ;   connectcuri:=result;
      rl. w3 (j49.)     ;
      al  w3  x3+1      ;   instacked:=instacked+1
      rs. w3  (j49.)    ;
      jl.    (j6.)      ;   end register expr

; procedure stackcuro and connectcuro;
; Stacks current output by use of then filepro-
; cesser as descriped in the fp-manual.

e5:   rl. w2 (j13.)     ;   w2:=last used;
      ds. w3 (j30.)     ; saved stack ref, saved w3
      rl. w3  j42.      ;
      rl  w3  x3+32     ;   get base  of fileprocesser
      al  w1  x3+h21    ;   get current output zone
      rl. w2  j48.      ;   get stack chain for current output
      jl  w3  x3+h29    ;   stack current output
      jl.    e7.        ;   end address expr.

; procedure unstackcuro;
; Makes a fp-call to unstack current output as
; descriped in the fp-manual.

e6:   rl. w2 (j13.)     ;   w2:=last used;
      ds. w3 (j30.)     ;   saved stack ref, saved w3
i0:   rl. w2  j42.      ;
      rl  w2  x2+32     ;   get base of fileprocesser
      jl  w3  x2+h79-2  ;   terminate current output
      rl. w3  j48.      ;  
      rx  w2  6         ;   get stack chain for current output
      jl  w3  x3+h30    ;   unstack current output
      rl. w3 (j50.)     ;
      al  w3  x3-1      ;outstacked:=outstacked-1
      rs. w3  (j50.)    ;
      jl.    (j8.)      ;   end address expr.

; procedure connectcuro(name);
; string or <any type array> name;
; Makes a fp-call to connect current output as
; descriped in the fp-manual.

e7:   rl. w2 (j13.)     ;   w2:=last used;
      ds. w3 (j30.)     ;   saved stack ref, saved w3
      dl  w1  x2+8      ;   get param: name
      so  w0  16        ;   if expr then
      jl. w3 (j4.)      ;   take expression;
      ds. w3 (j30.)     ;   saved stack ref, saved w3
      jl. w3  d1.       ;   w3:=takestring1(name);
      al  w2  x3        ;   w2:=address of name;
      am.    (j42.)     ;
      am     (32)       ;
      al  w1  x2+h21    ;
      al  w0  2       ;
      am.    (j42.)     ;
      am     (32)       ;
      jl  w3  h28-2     ;   connect current output
      rl  w1  0         ;   connectcuro:=result;
      rl. w3 (j50.)     ;
      al  w3  x3+1      ;outstacked:=outstacked+1
      rs. w3 (j50.)     ;
      jl.    (j6.)      ;   end register expr.

; procedure outendcur(char);
; Makes a call of the FP-procedure outend with
; the parameter char as the character to be output.

e8:   rl. w2 (j13.)     ;   w2:=last used;
      ds. w3 (j30.)     ;   saved stack ref, saved w3
      dl  w1  x2+8      ;   take param: char
      so  w0  16        ;   if expr then
      jl. w3 (j4.)      ;   take expression;
      ds. w3 (j30.)     ;   saved stack ref, saved w3
      rl  w2  x1        ;
      am.    (j42.)     ;
      am     (32)       ;   
      jl  w3  h33-2     ;   outend(out,false add char);
      jl.    (j8.)      ;   end address expr.

; integer procedure incharcur;
; This procedure makes a call of the fp-procedure
; inchar, as descriped in the fp-manual page 47.

e9:   rl. w2 (j13.)     ;   w2:=last used;
      ds. w3 (j30.)     ;   saved stack ref, saved w3
      am.    (j42.)     ;
      am     (32)       ;
      jl  w3  h25-2     ;   inchar:=next char from current
      al  w1  x2        ;           input;
      jl.    (j6.)      ;   end register expr.

; integer procedure outcharcur(char);
; address integer char;
; Makes a call of the fp-procedure outchar as descriped
; in the fp-manual page 47.
; charout:=numbers of characters printed;

e10:  rl. w2 (j13.)     ;   w2:=last used;
      ds. w3 (j30.)     ;   saved stack ref, saved w3
      dl  w1  x2+8      ;   take param: char
      so  w0  16        ;   if exppr then
      jl. w3 (j4.)      ;   take expression;
      ds. w3 (j30.)     ;   saved stack ref, saved w3
      al  w0  0         ;
      rs. w0  b0.       ;   count:=0;
      rl  w0  x1        ;
      al. w3  2         ;
      rl  w2  0         ;   for c:=1,2,3 do
      la. w2  f8.       ;   begin
      sn  w0  0         ;    if char.c=NULL then else 
      al. w3  g5.       ;    begin
      ls  w0  8         ;
      sn  w2  0         ;
      jl      x3        ;
      rx. w2  b0.       ;
      al  w2  x2+1      ;     count:=count+1;
      rx. w2  b0.       ;
      ls  w2 -16        ;
      am.    (j42.)     ;
      am     (32)       ;     outchar(char.c);
      jl      h26-2     ;    end;
g5:   rl. w1  b0.       ;   end;
      jl.    (j6.)      ;   end register expr.

; procedure closeout;
; Makes a call  of the fp-procedure closeup as 
; descriped in the fp-manual page ***. After this the procedure
; unstackcuro is called;

e11:  rl. w2 (j13.)     ;   w2:=last used;
      ds. w3 (j30.)     ;   saved stack ref, saved w3
      al  w2  25        ;
      am.    (j42.)     ;
      am     (32)       ;
      jl  w3  h34-2     ;   closeup on current output
      jl.     i0.       ;



b0:   0                 ;    work area
p.<:takestring:>



m.   end code of this segment
h.    0,r.(:504-k:)     ;   fill up the segment
w.    <:fpproc     <0>:>;   alarm text

e.                      ;   end slang segment

w.


; unstackcuri:
g0:   1                 ;   first tail: area with 1 segment
      0,0,0,0           ;   fill
      1<23+e3-e20       ;   entry point unstackcuri
      1<18,0            ;   procedure;
      4<12+e0-e20       ;   code proc, start of external list
      1<12+08           ;   1 code segment, bytes in perm core


; connectcuri:
      1<23+4            ;   modekind=backing store
      0,0,0,0           ;   fill
      1<23+e2-e20       ;   entry point connectcuri
      3<18+40<12,0      ;   procedure(undef);
      4<12+e0-e20       ;   code proc, start of external list
      1<12+08           ;   1 code segment, bytes in perm core


; unstackcuro:
      1<23+4            ;   modekind=backing store
      0,0,0,0           ;   fill
      1<23+e6-e20       ;   entry point unstackcuro
      1<18,0            ;   procedure;
      4<12+e0-e20       ;   code proc, start of external list
      1<12+08           ;   1 code segment, bytes in perm core


; connectcuro:
      1<23+4            ;   modekind=backing store
      0,0,0,0           ;   fill
      1<23+e5-e20       ;   entry point connectcuro
      3<18+40<12,0      ;   integer procedure(undef);
      4<12+e0-e20       ;   code proc, start of external list
      1<12+08           ;   1 code segment, bytes in perm core


; outendcur:
      1<23+4            ;   modekind=backing store
      0,0,0,0           ;   fill
      1<23+e8-e20       ;   entry point outend
      1<18+19<12,0      ;   procedure(address integer);
      4<12+e0-e20       ;   code proc, start of external list
      1<12+08           ;   1 code segment, bytes in own perm core


; incharcur:
      1<23+4            ;   modekind=backing store
      0,0,0,0           ;   fill
      1<23+e9-e20       ;   entry point inchar
      3<18+00<12,0      ;   integer procedure;
      4<12+e0-e20       ;   code proc, start of external list
      1<12+08           ;   1 code segment, bytes in perm core


; outcharcur:
      1<23+4            ;   modekind=backing store
      0,0,0,0           ;   fill
      1<23+e10-e20      ;   entry point charout
      3<18+19<12,0      ;   integer procedure(address integer);
      4<12+e0-e20       ;   code proc, start of external list
      1<12+08           ;   1 code segment, bytes in own perm core


; closeout:
g1:   1<23+4            ;   modekind=backing store
      0,0,0,0           ;   fill
      1<23+e11-e20      ;   entry point closeout
      1<18+00<12,0      ;   procedure;
      4<12+e0-e20       ;   code proc, start of external list
      1<12+08           ;   1 code segment, bytes in perm core


n.
\f


message starti
(starti=set 1
(starti=slang fpnames type.yes insertproc entry.no
 starti stopi sendm waita waitevent getevent,
  testbit moveb wordl senda gencopy testevent messadd pda ba from to bytes,
 coreaddr result)

if ok.no
end 
)
;HCØ 1980-02-06
; These code procedures uses 8 std. variabels:
; 1. messadd  address of a message_area
; 2. pda      address of the internal process descrip-
;             tion address
; 3. ba       buffer address
; 4. from     start address of an array
; 5. to       start address of an array
; 6. bytes    no of bytes to be moved
; 7. coreaddr address of a storage word
; 8. result   normally the result of the monitor proc.

; b.                    ;    fpnames dummy block

b. g1,e20               ;    block with names for tails
k=10000                 ;    and insertproc

s. g6,j58,b6,f6,i1      ;    start of slang segment for proc.
h.
g0=0                    ;    g0:=no of externals;
e20:
g1:  g2 , g2            ;    headword: rel of last point,
                        ;                rel of last abs word
j4:  g0+4 , 0           ;    RS entry 4, take expression
j6:  g0+6 , 0           ;    RS entry 6, end register expr.
j8:  g0+8 , 0           ;    RS entry 8, end addres expr.
j13: g0+13, 0           ;    RS entry 13, last used
j30: g0+30, 0           ;    RS entry 30,saved stack ref, saved w3
j41: g0+41, 0           ;    RS entry 41,parent process address
j51:     0, 1           ;    1. std. variable: messadd
j52:     0, 3           ;    2. std. variable: pda
j53:     0, 5           ;    3. std. variable: ba
j54:     0, 7           ;    4. std. variable: from
j55:     0, 9           ;    5. std. variable: to
j56:     0, 11          ;    6. std. variable: bytes
j57:     0, 13          ;    7. std. variable: coreaddr
j58:     0, 15          ;    8. std. variable: result

g2=k-2-g1               ;    end of abs word:=end of points;

w.
e0:   g0                ;    start of external list
      0                 ;
      81 01 08, 18 00   ;
b0:   0, b1:   0,r.4    ;    process name

; integer procedure starti;
; starti:=result of monitorproc;

e1:   rl. w2 (j13.)     ;    w2:=last used;
      ds. w3 (j30.)     ;    saved stack ref,saved w3
      rl. w2 (j52.)     ;
      al. w3  b0.       ; w3:=process name address
      dl  w1  x2+4
      ds  w1  x3+2
      dl  w1  x2+8
      ds  w1  x3+6
      jd  1<11+58       ;    start internal process;
      rl  w1  0         ;    starti:=result;
      jl.    (j6.)      ;    end of register expr.


; integer procedure stopi;
; stopi:=buffer address;

e2:   rl. w2 (j13.)     ;    w2:=last used;
      ds. w3 (j30.)     ;    saved stack ref, saved w3
      rl. w2 (j52.)     ;   
      al. w3  b0.       ;   w3:=process name address
      dl  w1  x2+4
      ds  w1  x3+2
      dl  w1  x2+8
      ds  w1  x3+6
      jd  1<11+60       ;    stop internal process
      rs. w0 (j58.)     ;    result:=w0;
      al  w1  x2        ;    stopi:=buffer address;
      jl.    (j6.)      ;    end of register expr.


; integer procedure sendm;
; sendm:=buffer address;

e3:   rl. w2 (j13.)     ;    w2:=last used;
      ds. w3 (j30.)     ;    saved stack ref, saved w3
      al. w3  b0.       ;    w3:=process name address;
      rl. w2 (j52.)     ;    w2:=process description address;
      rs  w2  x3+8      ;    saved description address
      dl  w1  x2+4      ;   
      ds  w1  x3+2      ;    move process name
      dl  w1  x2+8      ;
      ds  w1  x3+6      ;
      rl. w1 (j51.)     ;    w1:=message address;
      jd  1<11+16       ;    send message
      al  w1  x2        ;    sendm:=buffer address;
      jl.    (j6.)      ;    end register expr.


; integer procedure waita;
; waita:=result of monitorproc;

e4:   rl. w2 (j13.)     ;    w2:=last used;
      ds. w3 (j30.)     ;    saved stack ref, saved w3
      rl. w1 (j51.)     ;    w1:=answer address;
      rl. w2 (j53.)     ;    w2:=buffer address;
      jd  1<11+18       ;    wait answer;
      rl  w1  0         ;    waita:=result;
      jl.    (j6.)      ;    end register expr.


; integer procedure waitevent(ba);
; integer ba;
; waitevent:=result of monitorproc;
; the spare message buffer is however sorted out
e5:   rl. w2 (j13.)     ;    w2:=last used
      ds. w3 (j30.)     ;    saved stack ref, saved w3
      dl  w1  x2+8      ;    take integer param
      so  w0  16        ;    if expression then
      jl. w3 (j4.)      ;    goto RS take expression
      ds. w3 (j30.)     ;    saved stack ref, saved w3
      rl  w2  x1        ;    w2:=last buffer address
i0:   jd  1<11+24       ;    wait event
      am.    (j41.)     ;    if
      rl  w1  -2        ;    buffer address=spare then
      sn  w1  x2        ;    goto
      jl.     i0.       ;    next;
      rl  w1  4         ;    w1:=buf
      rx  w1  0         ;    w1:=result, w0:=buf
      dl. w3 (j30.)     ;    w3:=stack ref
      rs  w0 (x2+8)     ;    buffer_address:=next_buffer_address
      jl.    (j6.)      ;    end regeister expression


; procedure getevent(ba);
; integer ba;
e6:   rl. w2 (j13.)     ;    w2:=last used
      ds. w3 (j30.)     ;    saved stack ref, saved w3
      dl  w1  x2+8      ;    take param ba
      so  w0  16        ;    if expression then
      jl. w3 (j4.)      ;    take expression
      ds. w3 (j30.)     ;    save stack ref, save w3
      rl  w2  x1        ;    w2:=buffer_address
      jd  1<11+26       ;    get event
      jl.    (j8.)      ;    end address expression


; boolean procedure testbit(word,bitno);
; integer word,bitno;
; testbit:=if bitno of word is on then true else false;
e8:   rl. w2 (j13.)      ;    w2:=last used
      ds. w3 (j30.)      ;    save stack ref, save w3
      dl  w1  x2+8       ;    take param word
      so  w0  16         ;    if expression then
      jl. w3 (j4.)       ;    take expression
      ds. w3 (j30.)      ;    save stack ref, save w3
      rs  w1  x2+8       ;
      dl  w1  x2+12      ;    take param bitno
      so  w0  16         ;    if expression then
      jl. w3 (j4.)       ;    take expression
      ds. w3 (j30.)      ;    save stack ref, save w3
      rl  w1  x1         ;    w1:=bitno
      al  w3  1          ;    
      ls  w3  x1         ;    w3:=1 shift bitno
      rl  w1 (x2+8)      ;    w1:=word
      so  w1  x3         ;    if bit=1 then
      am       1         ;    true else
      al  w1  -1         ;    false
      jl.    (j6.)       ;    end register expression


; procedure moveb;    
; std. variabels used: from,to and bytes.
; Nothing is done if bytes is less than or equal
; to zero - no of bytes must be even.

e9:   rl. w2 (j13.)     ;    w2:=last used;
      ds. w3 (j30.)     ;    saved stack ref, saved w3
      rl. w3 (j56.)     ;    w3:=no of bytes to transfer;
      sh  w3  1         ;    if bytes<=1 then
      jl.    (j8.)      ;    end address expr.;
      rl. w1 (j54.)     ;
      rl. w2 (j55.)     ;    saved address' of form and to
      ds. w2  b1.       ;
f0:   al  w3  x3-4      ;   
      sh  w3 -1         ;    for bytes:=bytes-4 while bytes>=0 do
      jl.     f1.       ;    begin long L;
      am.    (b0.)      ;     L:=bytes;
      dl  w1  x3+2      ;     to.L:=from.L;
      am.    (b1.)      ;    end;
      ds  w1  x3+2      ;
      jl.     f0.       ;
f1:   sn  w3  0         ;    if bytes=0 then
      jl.    (j8.)      ;    end address expr.;
      rl. w1 (b0.)      ;    L:=0;
      rs. w1 (b1.)      ;    to.L:=from.L;
      jl.    (j8.)      ;    end address expr.


; integer procedure word_l;
; std. variable used: coreaddr
; wordl:=word(coreaddr);

e10:  rl. w2 (j13.)     ;    w2:=last used;
      ds. w3 (j30.)     ;    saved stack ref, saved w3
      am.    (j57.)     ;
      rl  w1 (0)        ;    wordl:=word(coreaddr);
      jl.    (j6.)      ;    end register expr.


; procedure send_a;
; std. variables used: result,ba,messadd

e11:  rl. w2 (j13.)     ;    w2:=last used;
      ds. w3 (j30.)     ;    saved stack ref, saved w3
      rl. w0 (j58.)     ;    w0:=result;
      rl. w1 (j51.)     ;    w1:=answer address;
      rl. w2 (j53.)     ;    w2:=buffer address;
      jd  1<11+22       ;    send answer;
      jl.    (j8.)      ;    end address expr.

e12:                    ; entry general copy
      rl. w2 (j13.)     ; w2:=last used
      ds. w3 (j30.)     ; saved stack ref, saved w3
      dl  w1  x2+8      ; take param buffer
      so  w0  16        ; if expression then
      jl. w3 (j4.)      ; take expression
      ds. w3 (j30.)     ; save stack ref, save w3
      rs  w1  x2+6      ; save address(buffer);
      dl  w1  x2+12     ; take param params
      ba  w1  0         ; w1:=abs dope
      rl  w3  x1        ; w3:=lower index-2
      wa  w3 (x2+12)    ;
      al  w1  x3+2      ; w1:=first addr(param)
      rl  w2 (x2+6)     ; w2:=buf
      jd  1<11+84       ; general copy
      rx  w1   0        ; w1:=result, w0:=moved
      rl. w2  (j13.)    ; w2:=last used
      rs  w0  (x2+16)   ;
      jl.     (j6.)     ; end register expression


; integer procedure testevent(ba,flag);
;integer ba,flag;
; testevent:=result of monitorproc;
; the spare message buffer is however sorted out
e13:  rl. w2 (j13.)     ;    w2:=last used
      ds. w3 (j30.)     ;    saved stack ref, saved w3
      dl  w1  x2+8      ;    take integer param
      so  w0  16        ;    if expression then
      jl. w3 (j4.)      ;    goto RS take expression
      ds. w3 (j30.)     ;    saved stack ref, saved w3
      rl  w2  x1        ;    w2:=last buffer address
i1:   jd  1<11+66       ;    test event
      am.    (j41.)     ;    if
      rl  w1  -2        ;    buffer address=spare then
      sn  w1  x2        ;    goto
      jl.     i0.       ;    next;
      rs. w1  b0.       ;    save flag
      rl  w1  4         ;    w1:=buf
      rx  w1  0         ;    w1:=result, w0:=buf
      dl. w3 (j30.)     ;    w3:=stack ref
      rs  w0 (x2+8)     ;    buffer_address:=next_buffer_address
      rl. w0  b0.       ;    get flag
      rs  w0 (x2+12)    ;    store flag
      jl.    (j6.)      ;    end register expression
m.   end code of this segment
h.    0,r.(:10504-k:)      ;    fill
w. <:p-proc     <0>:>   ;    alarm text
e.                      ; end slang segment;



w.

; starti:
g0:   1                 ;    first tail: area with 1 segment
      0,0,0,0           ;    fill
      1<23+e1-e20       ;    entry point starti
      3<18+0,0          ;    integer procedure;
      4<12+e0-e20       ;    code proc , start of external
      1<12+16           ;    1 code segment , bytes in permanent store

; stopi:
      1<23+4            ;    modekind=backing store
      0,0,0,0           ;    fill
      1<23+e2-e20       ;    entry point stopi
      3<18+0,0          ;    integer procedure;
      4<12+e0-e20       ;    code proc , start of external
      1<12+16           ;    1 code segment , bytes in permanent store

; sendm:
      1<23+4            ;    modekind=backing store
      0,0,0,0           ;    fill
      1<23+e3-e20       ;    entry point sendm
      3<18+0,0          ;    integer procedure;
      4<12+e0-e20       ;    code proc , start of external
      1<12+16           ;    1 code segment , bytes in permanent store

; waita:
      1<23+4            ;    modekind=backing store
      0,0,0,0           ;    fill
      1<23+e4-e20       ;    entry point waita
      3<18+0,0          ;    integer procedure;
      4<12+e0-e20       ;    code proc , start of external
      1<12+16           ;    1 code segment , bytes in permanent store

; waitevent:
      1<23+4            ;    modekind=backing store
      0,0,0,0           ;    fill
      1<23+e5-e20       ;    entry point waitevent
      3<18+19<12,0      ;    integer procedure(address integer);
      4<12+e0-e20       ;    code proc , start of external
      1<12+16           ;    1 code segment , bytes in permanent store

; getevent:
      1<23+4            ;    modekind=backing store
      0,0,0,0           ;    fill
      1<23+e6-e20       ;    entry point getevent
      1<18+19<12,0      ;    procedure(address integer);
      4<12+e0-e20       ;    code proc , start of external
      1<12+16           ;    1 code segment , bytes in permanent store

; testbit:
      1<23+4            ;    modekind=backing store
      0,0,0,0           ;    fill
      1<23+e8-e20       ;    entry point testbit
      2<18+19<12+19<6,0 ;    boolean procedure(integer,integer);
      4<12+e0-e20       ;    code proc , start of external
      1<12+16           ;    1 code segment , bytes in permanent store

; moveb:
      1<23+4            ;    modekind=backing store
      0,0,0,0           ;    fill
      1<23+e9-e20       ;    entry point moveb
      1<18+0,0          ;    procedure;
      4<12+e0-e20       ;    code proc , start of external
      1<12+16           ;    1 code segment , bytes in permanent store


; wordl:
      1<23+4            ;    modekind=backing store
      0,0,0,0           ;    fill
      1<23+e10-e20      ;    entry point wordl
      3<18+0,0          ;    integer procedure;
      4<12+e0-e20       ;    code proc , start of external
      1<12+16           ;    1 code segment, bytes in perm. store

; senda:
      1<23+4            ;    modekind=backing store
      0,0,0,0           ;    fill
      1<23+e11-e20      ;    entry point senda
      1<18+0,0          ;    procedure;
      4<12+e0-e20       ;    code proc , start of external
      1<12+16           ;    1 code segment, bytes in perm. store

; gencopy:     
      1<23+4            ;    mode kind=bs
      0,0,0,0           ;    fill
      1<23+e12-e20      ;    entry point gencopy
      3<18+19<12+25<6+19,0;  integer procedure(integer,integer array,integer);
      4<12+e0-e20       ;    code proc, start external
      1<12+16           ;    1 code segemnt. bytes in own core

; testevent:
      1<23+4            ; mode kind=bs
      0,0,0,0           ; fill
      1<23+e13-e20      ; entry point testevent
      3<18+19<12+19<6,0 ; integer procedure(address integer, address integer);
      4<12+e0-e20       ; code proc, start external
      1<12+16           ; 1 code segment, bytes in own


; messadd:
      1<23+4            ;    modekind=backingstore
      0,0,0,0           ;    fill
      1                 ;    byte 1 in permanent store
      9<18+0,0          ;    integer variabel;
      4<12              ;    code proc
      1<12+16           ;    1 code segment , bytes in permanent store

; pda:
      1<23+4            ;    modekind=backing store
      0,0,0,0           ;    fill
      3                 ;    byte 3 in permanent store
      9<18+0,0          ;    integer variabel;
      4<12              ;    code proc
      1<12+16           ;    1 code segment , bytes in permanent store

; ba:
      1<23+4            ;    modekind=backing store
      0,0,0,0           ;    fill
      5                 ;    byte 5 in permanent store
      9<18+0,0          ;    integer variabel;
      4<12              ;    code proc
      1<12+16           ;    1 code segment , bytes in permanent store

; from:
      1<23+4            ;    modekind=backing store
      0,0,0,0           ;    fill
      7                 ;    byte 7 in permanent store
      9<18+0,0          ;    integer variabel;
      4<12              ;    code proc
      1<12+16           ;    1 code segment , bytes in permanent store

; to:
      1<23+4            ;    modekind=backing store
      0,0,0,0           ;    fill
      9                 ;    byte 9 in permanent store
      9<18+0,0          ;    integer variabel;
      4<12              ;    code proc
      1<12+16           ;    1 code segment , bytes in permanent store

; bytes:
      1<23+4            ;    modekind=backing store
      0,0,0,0           ;    fill
      11                ;    byte 11 in permanent store
      9<18+0,0          ;    integer variabel;
      4<12              ;    code proc
      1<12+16           ;    1 code segment , bytes in permanent store

; coreaddr:
      1<23+4            ;    modekind=backing store
      0,0,0,0           ;    fill
      13                ;    byte 13 in permanent store
      9<18+0,0          ;    integer variabel;
      4<12              ;    code proc
      1<12+16           ;    1 code segment , bytes in permanent store

; result:
g1:   1<23+4            ;    modekind=backing store
      0,0,0,0           ;    fill
      15                ;    byte 15 in permanent store
      9<18+0,0          ;    integer variabel;
      4<12              ;    code proc
      1<12+16           ;    1 code segment , bytes in permanent store

n.
\f


message callcode



 callcode=set 1 
((callcode=slang fpnames type.yes insertproc entry.no
  callcode )
if ok.no
end
)


; b.                    ; fpnames dummy block

b. g1,e20               ;   block with names for tails
k=0                     ;   and insertproc.
                       m.callcode

s. g6,j48,d6,i24        ;    start of slang segment for proc.
h.
g0=0                    ;    g0:=no of externals;
e20:
g1:  g2 , g2            ;    headword: rel of last point,
                        ;                rel of last abs word
j4:  g0+4 , 0           ;    RS entry 4, take expression
j6:  g0+6 , 0           ;    RS entry 6, end register expr.
j13: g0+13, 0           ;    RS entry 13, last used
j30: g0+30, 0           ;    RS entry 30,saved stack ref, saved w3

g2=k-2-g1               ;    end of abs word:=end of points;

w.
e0:   g0                ;    start of external list
      0                 ;    number of bytes to initialize
w.    14 01 73, 18 00 00;    date, time

; integer procedure call_code(A,relative);
; <any type> array A; address integer relative;
; call_code:=what the user specifies;
; Initialize the working registers, save a return
; address in A and jumps to the first instr. to execute
; in A with w3 as link.

e2:   rl. w2 (j13.)     ;   w2:=last used;
      ds. w3 (j30.)     ;   saved stack ref, saved w3

      dl  w1  x2+12     ;   take second param: relative
      so  w0  16        ;   if expr then
      jl. w3 (j4.)      ;   take expression;
      ds. w3 (j30.)     ;   saved stack ref, saved w3
      rs  w1  x2+12     ;
      dl  w1  x2+8      ;
      jl. w3  d2.       ;   find first addr of A
      al. w0  i20.      ;   
      rs  w0  x1+0      ;   A(0):=return address;
      rl  w3  x1+2      ;   first instr:=A(1)+relative;
      wa  w3 (x2+12)    ;

      al  w0  0         ;   w0:=0;
      rl  w2  x1+4      ;   w2:=appetite; (A(2))
      jl  w3  x3        ;   goto first instr. to execute;
i20:  jl.   (j6.)       ;   end register expr.


; integer procedure absaddr;
; Finds the address of a variable or the first
; address of an array. A zone is treated as a real array.
;         at entry    at return
; w0      formal1     destroyed
; w1      formal2     abs address
; w2      not used    unchanged
; w3      link        kind

b. b6,w.

b0:   0                 ;   link
b1:   0                 ;   formal2
d2:   rs. w3  b0.       ;   save link
      rs. w1  b1.       ;   save formal2
      al  w3  2.11111   ;
      la  w3  0         ;   kind:=formal1 extract 5;
      sn  w3  23        ;   if kind=zone then
      al  w3  19        ;   kind:=real array;
      sl  w3  16        ;   if kind<16
      sl  w3  23        ;   or kind>22 then
      jl.     b2.       ;   begin
                        ;    absaddr:=addr(variable);
                        ;   end else
      ba  w1  0         ;   begin
      rl  w1  x1        ;    w1:=abs dope addr;
      wa. w1 (b1.)      ;    w1:=lower index-1; (even)
      am      2         ;    absaddr:=abs addr of first element;

b2:   al  w1  x1-1      ;
      jl.    (b0.)      ;   end;
e.                      ;   return


m.   end code of this segment
h.    0,r.(:504-k:)     ;    fill up the segment
w.    <:callcode   <0>:>;    alarm text

e.                      ;    end slang segment

w.

; callcode:
g0:
g1:   1                 ;   first tail: area with 1 segment
      0,0,0,0           ;    fill
      1<23+e2-e20       ;    entry point callcode
      3<18+19<12+41<6,0 ;   integer procedure(undef,address integer);
      4<12+e0-e20       ;    code proc , start of external
      1<12+00           ;    1 code segment , bytes in perm. core

n.
\f


message sendmessid

(sendmessid=set 1

(sendmessid=slang fpnames type.yes insertproc entry.no 
    sendmessid redefarray generaten zonedes,
 releaseproc rstable  integerexor exclude include)

if ok.no
end
if ok.yes
message permanent ok)





; HCØ  29 08 1972.

; b.                    ;    fpnames dummy block

b. g1,e20               ;    block with names for tails
k=0                     ;    and insertproc

s. g6,j48,b18,d6        ;    start of slang segment for proc.
h.
g0=0                    ;    g0:=no of externals;
e20:
g1:  g2 , g2            ;    headword: rel of last point,
                        ;                rel of last abs word
j3:  g0+3 , 0           ;    RS entry 3, reserve
j4:  g0+4 , 0           ;    RS entry 4, take expression
j6:  g0+6 , 0           ;    RS entry 6, end register expr.
j8:  g0+8 , 0           ;    RS entry 8, end addres expr.
j12: g0+12, 0           ;    RS entry 12, UV
j13: g0+13, 0           ;    RS entry 13, last used
j16: g0+16, 0           ;    RS entry 16, segment table base
j29: g0+29, 0           ;    RS entry 29, param alarm
j30: g0+30, 0           ;    RS entry 30,saved stack ref, saved w3
j42: g0+42, 0           ;    RS entry 42, victim

g2=k-2-g1               ;    end of abs word:=end of points;

w.
e0:   g0                ;    start of external list
       0                ;    number of bytes to initialize
w.    17 12 72, 16 00 00;    date, time
b0:   0, b1:   0,r.3    ;    work area
b2:   0,r.5             ;

j48:  rl  w1  0         ; END:   pr:=result;
      jl.    (j6.)      ;   end register expr.

; integer procedure send_mess_id(name,id,M);
; undef name; integer id;
; integer array M;
; send_mess_id:=result of monitor procedure;
;

e2:   rl. w2 (j13.)     ;    w2:=last used;
      ds. w3 (j30.)     ;    saved stack ref, saved w3
      dl  w1  x2+12     ;
      so  w0  16        ;    if expr then
      jl. w3 (j4.)      ;    take expression;
      ds. w3 (j30.)     ;    saved stack ref, saved w3
      rs  w1  x2+12     ;    saved second param
      dl  w1  x2+16     ;  
      ba  w1  0         ;    w1:=abs dope
      rl  w3  x1        ;    w3:=lower index -2
      wa  w3 (x2+16)    ; 
      al  w3  x3+2      ;
      rs  w3  x2+14     ;    save mess add
      dl  w1  x2+8      ;
      so  w0  16        ;    if expr then
      jl. w3 (j4.)      ;    take expression;
      ds. w3 (j30.)     ;    saved stack ref, saved w3
      jl. w3  d1.       ;    w3:=takestring name
      al  w2  x2-6      ;    adjust last used
      rl  w1  x2+14     ;    w1:=messadd;
      rl  w2  x2+12     ;    w2:=id
      jd  1<11+16       ;    send message
      rl  w1  4         ;    result:=buffer address
      jl.    (j6.)      ;    end register expression


; procedure redef_array(A,first,elements);
; value first,elements; integer first,elements;
; <any type> array A;
; comment changes the base and dope such that first is the
; first byte of the new array and elements is the
; number of elements;

e4:   rl. w2 (j13.)     ;    w2:=last used;
      ds. w3 (j30.)     ;    saved stack ref,saved w3
      dl  w1  x2+16     ;
      so  w0  16        ;    if expr then
      jl. w3 (j4.)      ;    take expression;
      ds. w3 (j30.)     ;    saved stack ref, saved w3
      rs  w1  x2+16     ;    saved third param
      dl  w1  x2+12     ;
      so  w0  16        ;    if expr then
      jl. w3 (j4.)      ;    take expression;
      ds. w3 (j30.)     ;    saved stack ref, saved w3
      rl  w1  x1        ;    w1:=first;
      al  w1  x1-2      ;
      rs  w1 (x2+8)     ;    base word:=first;
      bz  w0  x2+7      ;    kind:=byte1.formal1;
      al  w3  4         ;    K:= 4;
      sn  w0  17        ;    if kind=boolean then
      al  w3  1         ;    K:= 1;
      sn  w0  18        ;    if kind=integer then
      al  w3  2         ;    K:= 2;
      rl  w1  x2+8      ;
      ba  w1  x2+6      ;    w1:=absolute dope address;
      al  w0  0         ;    dope:=0;
      rs  w0  x1        ;
      wm  w3 (x2+16)    ;    low index:=0;
      rs  w3  x1-2      ;    upper index:=elements*K;
      jl.    (j8.)      ;    end address expr.


; integer procedure generate_n(A);
; <any type> array A;
; generate_n:=result of monitor proc;

e5:   rl. w2 (j13.)     ;    w2:=last used;
      ds. w3 (j30.)     ;    saved stack ref, saved w3
      dl  w1  x2+8      ;  
      ba  w1  0         ;    w1:=abs dope address;
      rl  w3  x1        ;    w3:=low index-K;
      wa  w3 (x2+8)     ;    
      al  w3  x3+2      ;    w3:=addr of first element;
      jd  1<11+68       ;    generate name
      jl.     j48.      ;    goto END;


; integer procedure zone_des(z);
; zone or zone array z;
; zonedes:=absolute address of the zone descriptor;

e6:   rl. w2 (j13.)     ;    w2:=last used;
      ds. w3 (j30.)     ;    saved stack ref, saved w3
      rl  w1  x2+8      ;    zonedes:=addr of zone;
      jl.    (j6.)      ;    end register expression.

; procedure release_proc(name);
; string or <any type array name;

e7:   rl. w2 (j13.)     ;    w2:=last used;
      ds. w3 (j30.)     ;    saved stack ref, saved w3
      dl  w1  x2+8      ;    take parameter name
      so  w0  16        ;    if expr then
      jl. w3 (j4.)      ;    take expression;
      ds. w3 (j30.)     ;    saved stack ref, saved w3
      jl. w3  d1.       ;    w3:=take string1(name);
      jd  1<11+10       ;    release process
      jl.    (j8.)      ;    end address expr.


; integer procedure rstable;
; rstable:=first address of the RS-table (victim);

e8:   rl. w2 (j13.)     ;    w2:=last used;
      ds. w3 (j30.)     ;   saved stack ref, saved w3
      rl. w1  j42.      ;   rstable:=first addr of rs-table;
      jl.    (j6.)      ;   end register expr.

; integer procedure integer_exor(i1,i2);
; address integer i1,i2;
; The machine operation lx is made on i1 and i2,
; and the result is delivered in the procedure.

e9:   rl. w2 (j13.)     ;   w2:=last used;
      ds. w3 (j30.)     ;   saved stack ref, saved w3
      dl  w1  x2+8      ;   take first param
      so  w0  16        ;   if expr then
      jl. w3 (j4.)      ;   take expression;
      ds. w3 (j30.)     ;   saved stack ref, saved w3
      rs  w1  x2+8      ;
      dl  w1  x2+12     ;   take second param
      so  w0  16        ;   if expr then
      jl. w3 (j4.)      ;   take expression;
      ds. w3 (j30.)     ;   saved stack ref, saved w3
      rl  w1  x1        ;
      lx  w1 (x2+8)     ;   integerexor:=i1 lx i2;
      jl.    (j6.)      ;

; integer procedure exclude(name,devno);
; string or <any type array> name;
; address integer devno;
e10:  rl. w2 (j13.)     ;w2:=last used
      ds. w3 (j30.)     ;save stack ref ,save w3
      dl  w1  x2+12     ;take second parm: devno
      so  w0  16        ;if expr then
      jl. w3 (j4.)      ;take expression
      ds. w3 (j30.)     ;save stack ref, save w3
      rs  w1 x2+12      ;
      dl  w1  x2+8      ;take first param: name
      so  w0 16         ;if expression then
      jl. w3 (j4.)      ;take expression
      ds. w3 (j30.)    ;save satck ref ,save w3
      jl. w3  d1.       ;w3:=take string
      rl  w1 (x2+ 6)    ;
      jd  1<11+14       ;exclude
      jl.     j48.      ;goto end;

; integer procedure include(name,devno);
; string or <any type array> name;
; address integer devno;
e11:  rl. w2 (j13.)     ;   w2:=last used;
      ds. w3 (j30.)     ;   saved stack ref, saved w3
      dl  w1  x2+12     ;   take second param: devno
      so  w0  16        ;   if expr then
      jl. w3 (j4.)      ;   take expression;
      ds. w3 (j30.)     ;   saved stack ref, saved w3 (new stack top)
      rs  w1  x2+12     ;
      dl  w1  x2+8      ;   take first param: name
      so  w0  16        ;   if expr then
      jl. w3 (j4.)      ;   take expression;
      ds. w3 (j30.)     ;   saved stack ref, saved w3
      jl. w3  d1.       ;   w3:=take string1(name);
      rl  w1 (x2+ 6)    ;
      jd  1<11+ 12      ;include      
      jl.     j48.      ;    goto END;
p.<:takestring:>


b11:  0,  b12:  0       ;    zeroes
b13:  0,  b14:  0       ;    work area item
b15:  2.1 1111          ;    kind mask


m.   end code of this segment
h.    0,r.(:504-k:)     ;    fill up the segment
w.    <:mixproc    <0>:>;    alarm text

e.                      ;    end slang segment

w.

; send_mess_id:
g0:   1                 ;    modekind=backing store
      0,0,0,0           ;    fill
      1<23+e2-e20       ;    entry point send_mess_id
      3<18+25<12+19<6+41;   integer procedure(undef,
      0                 ;       address integer,integer array);
      4<12+e0-e20       ;    code proc , start of external
      1<12+0           ;    1 code segment , bytes in perm. core

; redefarray:
      1<23+4            ;    first tail: area with 1 segment
      0,0,0,0           ;    fill
      1<23+e4-e20       ;    entry point redefarray
      1<18+19<12+19<6+41;    procedure(undef,address integer,
      0                 ;         address integer);
      4<12+e0-e20       ;    code proc , start of external
      1<12+0            ;    1 code segment , bytes in perm. core

; generaten:
      1<23+4            ;    modekind=backing store
      0,0,0,0           ;    fill
      1<23+e5-e20       ;    entry point generaten
      3<18+41<12,0      ;    integer procedure(undef);
      4<12+e0-e20       ;    code proc , start of external
      1<12+0            ;    1 code segment , bytes in perm. core

; zonedes:
      1<23+4            ;    modekind=backing store
      0,0,0,0           ;    fill
      1<23+e6-e20       ;    entry point zonedes
      3<18+41<12,0      ;    integer procedure(undef);
      4<12+e0-e20       ;    code proc , start of external
      1<12+0            ;    1 code segment , bytes in perm. core

; releaseproc:
      1<23+4            ;    modekind=backing store
      0,0,0,0           ;    fill
      1<23+e7-e20       ;    entry point release _proc
      1<18+41<12,0      ;    procedure(undef);
      4<12+e0-e20       ;    code proc, start of external
      1<12+0            ;    1 code segment, bytes in perm. core

; rstable:
      1<23+4            ;    modekind=backing store
      0,0,0,0           ;    fill
      1<23+e8-e20       ;    entry point rs_table
      3<18,0            ;    integer procedure;
      4<12+e0-e20       ;    code proc, start of external
      1<12+0            ;    1 code segment, bytes in perm. core

; integerexor:
      1<23+4            ;   modekink=backing store
      0,0,0,0           ;   fill
      1<23+e9-e20       ;   entry point integerexor
      3<18+19<12+19<6,0 ;   integer procedure(addr int,addr int);
      4<12+e0-e20       ;   code proc, start of externallist
      1<12+0            ;   1 code segment, bytes in perm core

; exclude:
      1<23+4            ;    modekind=backing store
      0,0,0,0           ;    fill
      1<23+e10-e20      ;    entry point exclude
      3<18+19<12+41<6,0 ;    integer procedure(undef,address integer);
      4<12+e0-e20       ;    code proc, start of external list
      1<12+0            ;    1 code segment, bytes in own perm core

; include:
g1:   1<23+4            ;    modekind=backingstore
      0,0,0,0           ;    fill
      1<23+e11-e20      ;    entry point include
      3<18+19<12+41<6,0 ;    integer procedure(undef,address integer);
      4<12+e0-e20       ;    code proc, start of external list
      1<12+0            ;    1 code segment, bytes in own perm core

n.
\f


message lookupentry
(lookupentry=set 1
(lookupentry=slang fpnames type.yes insertproc entry.no 
lookupentry lookuptail createentry  permentry,
removeentry careaproc program  createper )

if ok.no
end
)


;hcø 31-7-72



;b.                 ;fpnames dummy block

b. g1, e20      w.  ;block with names for tails and insertproc

k=10000

s. g6,j48,f7,b15,i10,d3;start of slang segment for procedures
h.

g0=0                ;g0:=no of externals
e20:

g1:  g2  ,  g2      ;head word: rel of last point, rel of last abs word


j13: g0 + 13 , 0    ;RS entry 13, last used
j30: g0 + 30 , 0    ;RS entry 30, saved stack ref, saved w3
j4:  g0 +  4 , 0    ;RS entry  4, take expression
j6:  g0 +  6 , 0    ;RS entry  6, end register expression
j8:  g0 +  8 , 0    ;RS entry  8, end address expression
j12: g0 + 12 , 0    ;RS entry 12, UV
j16: g0 + 16 , 0    ;RS entry 16, segment table base
j29: g0 + 29 , 0    ;RS entry 29, param alarm
j40: g0 + 40 , 0    ;RS entry 40, program name

g2 = k-2-g1         ;end of abs words:=end of points

w.

e0:  g0             ;start external list
      0
     25 04 73,14 00 00
b0:  0 , b1: 0,r.4  ;name
b2:  0 , b3: 0,r.9  ;tail
w.
i0:   rl  w1  0         ;   w1:=result;
      jl.    (j6.)      ;   end register expression

e1:                 ;entry lookup_entry
     rl. w2 (j13.)  ;w2:=last used
     ds. w3 (j30.)  ;saved stack ref, saved w3
     dl  w1  x2+8   ;take param name
     so  w0  16     ;if string expression then
     jl. w3 (j4.)   ;take expression
     ds. w3 (j30.)  ;save stack ref, save w3
     jl. w3  d1.    ;w:=take string1(name)
     al. w1  b2.    ;w1:=tail address
     jd  1<11+42    ;monitor call
     jl.     i0.    ;end register expression

e2:                 ;entry lookup_tail
     rl. w2 (j13.)  ;w2:=stack ref
     ds. w3 (j30.)  ;save stack ref, save w3
     dl  w1  x2+8   ;take name param
     so  w0  16     ;if expression then
     jl. w3 (j4.)   ;take expression
     ds. w3 (j30.)  ;save stack ref, save w3
     jl. w3  d1.    ;w3:=takestring1(name);
     dl  w1  x2+ 6  ;take param tail
     ba  w1  0      ;w1:=abs dope addr
     rl  w1  x1     ;w1:=lower index-k
     wa  w1 (x2+ 6) ;
     al  w1  x1+2   ;w1:=first addr
     jd  1<11+42    ;lookup entry
     jl.     i0.    ;end register expression

e3:                 ;entry create_entry
     rl. w2 (j13.)  ;w2:=last used
     ds. w3 (j30.)  ;saved stack ref, saved w3
     dl  w1  x2+12  ;take integer array param tail
     ba  w1  0      ;w1:=abs dope address
     rl  w3  x1     ;w3:=lower index-K(K=2)
     wa  w3 (x2+12) ;
     al  w1  x3+2   ;w3:=addr of first element
     rs  w1  x2+10  ;store tail addr
     dl  w1  x2+8   ;take param name
     so  w0  16     ;if string expression then
     jl. w3 (j4.)   ;take expression
     ds. w3 (j30.)  ;save stack ref, save w3
     jl. w3  d1.    ;w3:=take string1(name);
     rl  w1  x2+ 4  ;w1:=message addr
     jd  1<11+40    ;create entry
     jl.     i0.    ;end register expression

e5:                 ;entry perm_entry
     rl. w2 (j13.)  ;w2:=last used
     ds. w3 (j30.)  ;saved stack ref , saved w3
     dl  w1  x2+12  ;take param key
     so  w0  16     ;if expression then
     jl. w3 (j4.)   ;take expression
     ds. w3 (j30.)  ;save stack ref, save w3
     dl  w1  x1     ;w1:=value
     rl  w3  x2+10  ;w3:=formal.1
     sz  w3  1      ;if real then
     cf  w1  0      ;convert to integer
     rs  w1  x2+10  ;save key
     dl  w1  x2+8   ;take param name
     so  w0  16     ;if expr then
     jl. w3 (j4.)   ;goto RS take expression
     ds. w3 (j30.)  ;saved stack ref,saved w3
     jl. w3  d1.    ;w3:=take string1(name);
     rl  w1  x2+ 4  ;w1:=key
     jd  1<11+50    ;perm_entry
     jl.     i0.    ;end register expression

e6:                 ;entry remove_entry
     rl. w2 (j13.)  ;w2:=last used
     ds. w3 (j30.)  ;saved stack ref, saved w3
     dl  w1  x2+8   ;take integer param
     so  w0  16     ;if expression then
     jl. w3 (j4.)   ;goto RS take expression
     ds. w3 (j30.)  ;saved stack ref, saved w3
     jl. w3 d1.     ;w3:=take string1(name);
     jd  1<11+48    ;remove entry
     jl.     i0.    ;end regeister expression

e7:                 ;entry c_area_proc:
     rl. w2 (j13.)  ;w2:=last used
     ds. w3 (j30.)  ;save stack ref, save w3
     dl  w1  x2+8   ;take param name
     so  w0  16     ;if expression then
     jl. w3 (j4.)   ;take expression
     ds. w3 (j30.)  ;save stack ref, save w3
     jl. w3  d1.    ;w3:=take string1(name);
     jd  1<11+52    ;create area process
     jl.     i0.    ;end register expresssion

e8:                 ;entry program:
     rl. w2 (j13.)  ;w2:=last used
     ds. w3 (j30.)  ;save stack ref, save w3
     rl. w1  j40.   ;w1:=addr program name
     jl.    (j6.)   ;end register expression


e10:                    ;entry create per
      rl. w2 (j13.)     ;   w2:=last used;
      ds. w3 (j30.)     ;   saved stack ref,saved w3
      dl  w1  x2+12     ;   take param devno
      so  w0  16        ;   if expr then
      jl. w3 (j4.)      ;   take expression;
      ds. w3 (j30.)     ;   saved stack ref, saved w3
      rs  w1  x2+12     ;   saved devno
      dl  w1  x2+8      ;   take param name
      so  w0  16        ;   if expr then
      jl. w3 (j4.)      ;   take expression;
      ds. w3 (j30.)     ;   saved stack ref, saved w3
      jl. w3  d1.       ;   w3:=takestring1(name);
      rl  w1 (x2+ 6)    ;   w1:=devno;
      jd  1<11+54       ;   create peripheral process
      jl.     i0.       ;   end register expr.
p.<:takestring:>
b13: 0, b14: 0      ;work area item
b15:  2.11111       ;kind mask
m.   end code of this segment
h.    0,r.(:10504-k:) w.
<:bsproc     <0>:>
e.                  ;end slang segment


;lookup_entry:
g0: 1               ;first tail: area with 1 segment
    0,0,0,0         ;fill
    1<23+e1-e20     ;entry point lookup_entry
    3<18+41<12,0    ;integer procedure(string);
    4<12+e0-e20     ;code proc start of external
    1<12+00         ;1 code segment

;lookup_tail:
    1<23+4          ;modekind=backing store
    0,0,0,0         ;fill
    1<23+e2-e20     ;entry point lookup_tail
    3<18+25<12+41<6,0;integer procedure(string, integer array);
    4<12+e0-e20     ;code proc , start of external
    1<12+00         ;1 code segment

;create_entry:
    1<23+4          ;modekind=backing store
    0,0,0,0         ;fill
    1<23+e3-e20     ;entry point create_entry
    3<18+25<12+41<6,0;integer procedure(string,integer array);
    4<12+e0-e20     ;code proc , start of external
    1<12+00         ;1 code segment

;perm_entry:
    1<23+4          ;modekind=backingstore
    0,0,0,0         ;fill
    1<23+e5-e20     ;entry point perm_entry
    3<18+13<12+41<6,0;integer procedure(string,value integer);
    4<12+e0-e20     ;code proc , start of external
    1<12+00         ;1 code segment

;remove_entry:
    1<23+4          ;modekind=backing store
    0,0,0,0         ;fill
    1<23+e6-e20     ;entry point remove entry
    3<18+41<12 ,0   ;integer procedure(string);
    4<12+e0-e20     ;code proc , start of external
    1<12+00         ;1 code segm

;c_area_proc:
    1<23+4          ;modekind:=backing store
    0,0,0,0         ;fill
    1<23+e7-e20     ;entry point c_area_proc
    3<18+41<12,0    ;integer procedure(undef);
    4<12+e0-e20     ;code proc , start external
    1<12+00         ;1 code segment

;program:
    1<23+4          ;modekind=backing store
    0,0,0,0         ;fill
    1<23+e8-e20     ;entry point program
    3<18,0          ;integer procedure;
    4<12+e0-e20     ;code proc , start external
    1<12+00         ;1 code segment

;create_per:
g1:      1<23+4     ;modekind=backingstore
      0,0,0,0       ;fill
      1<23+e10-e20  ;entry point create_per
      3<18+19<12+41<6;integer procedure(undef,address integr);
      0             ;
      4<12+e0-e20   ;code proc, start of external
      1<12+00       ;1 code segment

n.
\f


message movetext
movetext=set 2
((movetext=slang fpnames type.yes insertproc entry.no
  movetext movebytes)

if ok.no
end
)
;hcø 28-7-72 
;procedure move bytes and move text

; b. h100              ; fpnames dummy block

b. g1, e6 w.           ; block with names for tails and insertproc

k= 10000

s. g6, j48, b1, c0, i12; start of slang segment for procedures
h.

g0 = 0                 ; g0 = number of externals
e5:

g1:  g2      ,  g2     ; head word: rel of last point, rel of last abs word

j13: g0 + 13 ,  0      ; RS entry 13, last used
j30: g0 + 30 ,  0      ;     -    30, saved stack ref, saved w3
j6:  g0 +  6 ,  0      ;     -     6, end register expression
j4:  g0 +  4 ,  0      ;     -     4, take expression
j8:  g0 +  8 ,  0      ;     -     8, end addres expression
j16: g0 + 16 ,  0      ;     -    16, segment table base
j21: g0 + 21 ,  0      ;     -    21, general alarm
j29: g0 + 29 ,  0      ;     -    29, param alarm
j46: 1<11o.1 ,  0      ; segment table address of next segment

g2 = k-2-g1            ; end of abs words = end of points

w.

e0:  g0                ; start of external list: number of externals
     0                 ;   number of bytes in own permanent core to be
                       ;   initialized 
     15 12 72, 17 00 00;  date and time of this version


; integer procedure movetext(addr,s);
; value addr; integer addr; string s;
; Moves a string s to an address addr and forward. The
; procedure terminates if and only if a Null-character
; is met.

e1:   rl. w2 (j13.)     ;   w2:=last used;
      ds. w3 (j30.)     ;   saved stack ref, saved w3

      dl  w1  x2+8      ;   take first param
      so  w0  16        ;   if expr then
      jl. w3 (j4.)      ;   take expression;
      ds. w3 (j30.)     ;   saved stack ref, saved w3
      rl  w1  x1        ;
      rs  w1  x2+6      ;
      rs  w1  x2+8      ;

i0:   dl  w1  x2+12     ; String:
      so  w0  16        ;   if expr then
      jl. w3 (j4.)      ;   take expression;
      ds. w3 (j30.)     ;   saved stack ref, saved w3
      dl  w1  x1        ;   item:=doubelword(;
      sh  w1 -1         ;   if item.second word<0 then
      jl.     i2.       ;   goto Long string;
      sl  w0  0         ;   if item.first word>=0 then
      jl.     i1.       ;   goto Short string;
      am     (x2+8)     ; Layout:
      ds  w1  2         ;   move layout to addr and addr+2
      al  w1  4         ;   movetext:=4;
      jl.    (j6.)      ;   end register expr.

i1:   jl. w3  c0.       ; Short string:  store(item);
      al. w0  i5.       ;   alarm(<:string:>,0);
      al  w1  0         ;
      jl. w3 (j21.)     ;

i2:   hs. w0  i12.      ; Long string:
      bz  w3  0         ;   Note w0=point=segm number<12+segm rel
      ls  w3  1         ;   segm table addr:=segment number*2
      wa. w3 (j16.)     ;        +segment table base;
      rl  w3  x3        ;
i12=k+1
i3:   dl  w1  x3+0      ; Next:
      sh  w1 -1         ;   item:=core(w3+segment relative);
      jl.     i2.       ;   if item.second word<0 then
      rs. w3  i4.       ;   goto Long string;
      jl. w3  c0.       ;   store(item);
      rl. w3  i4.       ;
      al  w3  x3-4      ;   w3:=w3-4;
      jl.     i3.       ;   goto Next;
i4:   0                 ;   work
i5:   <:<10>string  :>  ;   alarm text

; procedure store(item);
; Stores an item integer by integer and returns to
; calling program if a Null- character is met.
;           at entry      at return
; w0,w1     item          destroyed
; w2        last used     last used
; w3        link          destroyed

b. b6,   w.             ; begin
b0:   0                 ;   link
b1:   8.377 000 000     ;   constant
b2:   0,0               ;   work

c0:   rs. w3  b0.       ;   save return;
      rl  w3  x2+8      ;
      ds. w1  b2.+2     ;
      al  w1  0         ;
b3:   rl. w0  x1+b2.    ;
      rs  w0  x3        ;   for i:=item.first word,
      al  w3  x3+2      ;          item.second word do
      rs  w3  x2+8      ;   begin
      sz. w0 (b1.)      ;    
      jl.     4         ;
      jl.     b4.       ;    core(addr):=i;
      ls  w0  8         ;    addr:=addr+2;
      sz. w0 (b1.)      ;
      jl.     4         ;
      jl.     b4.       ;    for j:=-16,-8,0 do
      ls  w0  8         ;    if i shift j extract 8=0 then
      sz. w0 (b1.)      ;    goto FIN;
      jl.     4         ;
      jl.     b4.       ;
      se  w1  0         ;   end i;
      jl.    (b0.)      ;
      al  w1  2         ;
      jl.     b3.       ;

b4:   rl  w1  x2+8      ; FIN:
      ws  w1  x2+6      ;   movetext:=number of bytes used;
      jl.    (j6.)      ;   end register expr.

e.                      ; end store;


;procedure move_bytes(from,to,bytes);
;address integer from,to;
;value bytes; integer bytes;

b. i1, d2, c0, a1 , f7 ; block for move_bytes
w.
f0:  0                 ; base next segm
f1:  0                 ; bytes
f2:  0                 ; from
f3:  0                 ; to
f5:  2                 ; length decrement
f7:  2.11              ; mask for modulo 4
e2:                     ;entry move_bytes
     rl. w2    (j13.)  ;w2:=stack ref
     ds. w3    (j30.)  ;save stack ref, save w3
     dl  w1    x2+8    ;take integer param from
     so  w0    16      ;if expression
     jl. w3    (j4.)   ;take expression
     ds. w3    (j30.)  ;save stack ref, save w3
     dl  w1    x2+12   ;take integer param to
     so  w0    16      ;if expression then
     jl. w3    (j4.)   ;take expression
     ds. w3    (j30.)  ;save stack ref, save w3
     dl  w1    x2+16   ;take integer param bytes
     so  w0    16      ;if expression then
     jl. w3    (j4.)   ;take expression
     ds. w3    (j30.)  ;save stack ref, save w3
     dl  w1    x1      ;take integer value
     rl  w3    x2+14   ;w3:=bytes formal.1
     sz  w1    0       ;if real then
     cf  w1    0       ;convert to integer
     rs  w1    x2+14   ;save bytes
     rl. w3    (j46.)  ; w3:=segment table addr
     al. w1     d0.    ;   w3:= segment table(next segment);
     rs  w1  x3+f6     ;   w1:= address of return from next segm;
                       ;   store w1 on next segment;
;This is the first reference to the next segment. It may change
;the segment allocation, but this segment will stay in core.
;Note that no references to RS-routines or other segments are
;performed after this point, except exits from the procedure.
;As a consequence the working locations on this segment are used
;freely.
     rs. w3     f0.    ;   save the adjusted base of next segment;
     rl  w0    x2+14   ; w0:=bytes
     rl  w1   (x2+8)   ;w1:=from;
     al  w1    x1-2    ;w1:=from-2;
     ds. w1    f2.     ;store from,bytes
     rl  w3   (x2+12)  ;w3:=to
     al  w3    x3-2    ;w3:=from-2;
     rs. w3    f3.     ;store to
     rl  w2    2       ;w2:=to
     rl  w1     0      ;
     sh  w0     0      ;if bytes<=0 then
     jl. w3     (j8.)  ;end address expression
     sl  w3     9      ;if to<8 or
     sh  w2     8      ;or from <8 then
     jl. w3     (j29.) ;param alarm
;In the following code w2 and w3 will always contain the current
;base addresses for the parts of A and B to be moved.
;W0 is temporarily used for length = number of bytes still to
;be moved.
;W1 is temporarily used for portion = - number of bytes to be
;moved in this round.

d0:  rl. w0     f1.    ; return from segm 2: w0:= length;
     al  w1     i0     ;   w1:= portion:= -maxbytes for 1 round;
     sl  w0     i1     ;   if length > maxbytes
     jl.        d1.    ;   then goto move;
     ac  w1    (0)     ;   portion:= - length;
     la. w0     f7.    ;   portion:= portion +
     wa  w1     0      ;     length mod 4;
     rl. w0     f1.    ;
     sl  w0     4      ;   if length >= 4
     jl.        d1.    ;   then goto move;
a1:  rl  w1  x2+2      ; more:
     sn  w0     1      ;   if length = 1 then
     jl.        a0.    ;   goto byte;
     sh  w0     0      ;   if length <= 0
     jl.       (j8.)   ;   then goto rs end addr expr;
     rs  w1  x3+2      ;   move word from A to B;
     al  w2  x2+2      ;   from:= from + 2;
     al  w3  x3+2      ;   to:= to + 2;
     ws. w0     f5.    ;   length:= length - 2;
     jl.        a1.    ;   goto more;
a0:  bz  w1     2      ; byte:
     hs  w1  x3+1      ;   move last byte from A to B;
     jl.       (j8.)   ;   goto rs end address expression;

d1:  wa  w0     2      ; move:
     rs. w0     f1.    ;   length:= length + portion;
     ws  w2     2      ;   from:= from - portion;
     ws  w3     2      ;   to:= to - portion;
     am.       (f0.)   ;   goto movelist(portion + maxbytes);
     jl      x1+g6     ;
;Note: The next segment is already in core. Thus w3 nedd not be
;used in the jump.


g3:
c. g3 - g1 - 506
   m.code on segment 1 too long
z.

c.502-g3+g1,  jl -1 , r. 252-(:g3-g1:)>1  z.
;fill rest of segment with the illegal instruction jl -1

<:move proc  <0>:>     ; alarm text segment 1
\f



;start of segment 2 containing the movelist

g5:              0     ; head word: no abs words or points

f6=k-g5     ,    0     ; return addr to previous segment

;movelist:
;   moves a number of bytes = portion from A to B. Last word
;   moved is from word to to word.
dl w1 x2-500  , ds w1 x3-500  , dl w1 x2-496  , ds w1 x3-496
dl w1 x2-492  , ds w1 x3-492  , dl w1 x2-488  , ds w1 x3-488
dl w1 x2-484  , ds w1 x3-484  , dl w1 x2-480  , ds w1 x3-480
dl w1 x2-476  , ds w1 x3-476  , dl w1 x2-472  , ds w1 x3-472
dl w1 x2-468  , ds w1 x3-468  , dl w1 x2-464  , ds w1 x3-464
dl w1 x2-460  , ds w1 x3-460  , dl w1 x2-456  , ds w1 x3-456
dl w1 x2-452  , ds w1 x3-452  , dl w1 x2-448  , ds w1 x3-448
dl w1 x2-444  , ds w1 x3-444  , dl w1 x2-440  , ds w1 x3-440
dl w1 x2-436  , ds w1 x3-436  , dl w1 x2-432  , ds w1 x3-432
dl w1 x2-428  , ds w1 x3-428  , dl w1 x2-424  , ds w1 x3-424
dl w1 x2-420  , ds w1 x3-420  , dl w1 x2-416  , ds w1 x3-416
dl w1 x2-412  , ds w1 x3-412  , dl w1 x2-408  , ds w1 x3-408
dl w1 x2-404  , ds w1 x3-404  , dl w1 x2-400  , ds w1 x3-400
dl w1 x2-396  , ds w1 x3-396  , dl w1 x2-392  , ds w1 x3-392
dl w1 x2-388  , ds w1 x3-388  , dl w1 x2-384  , ds w1 x3-384
dl w1 x2-380  , ds w1 x3-380  , dl w1 x2-376  , ds w1 x3-376
dl w1 x2-372  , ds w1 x3-372  , dl w1 x2-368  , ds w1 x3-368
dl w1 x2-364  , ds w1 x3-364  , dl w1 x2-360  , ds w1 x3-360
dl w1 x2-356  , ds w1 x3-356  , dl w1 x2-352  , ds w1 x3-352
dl w1 x2-348  , ds w1 x3-348  , dl w1 x2-344  , ds w1 x3-344
dl w1 x2-340  , ds w1 x3-340  , dl w1 x2-336  , ds w1 x3-336
dl w1 x2-332  , ds w1 x3-332  , dl w1 x2-328  , ds w1 x3-328
dl w1 x2-324  , ds w1 x3-324  , dl w1 x2-320  , ds w1 x3-320
dl w1 x2-316  , ds w1 x3-316  , dl w1 x2-312  , ds w1 x3-312
dl w1 x2-308  , ds w1 x3-308  , dl w1 x2-304  , ds w1 x3-304
dl w1 x2-300  , ds w1 x3-300  , dl w1 x2-296  , ds w1 x3-296
dl w1 x2-292  , ds w1 x3-292  , dl w1 x2-288  , ds w1 x3-288
dl w1 x2-284  , ds w1 x3-284  , dl w1 x2-280  , ds w1 x3-280
dl w1 x2-276  , ds w1 x3-276  , dl w1 x2-272  , ds w1 x3-272
dl w1 x2-268  , ds w1 x3-268  , dl w1 x2-264  , ds w1 x3-264
dl w1 x2-260  , ds w1 x3-260  , dl w1 x2-256  , ds w1 x3-256
dl w1 x2-252  , ds w1 x3-252  , dl w1 x2-248  , ds w1 x3-248
dl w1 x2-244  , ds w1 x3-244  , dl w1 x2-240  , ds w1 x3-240
dl w1 x2-236  , ds w1 x3-236  , dl w1 x2-232  , ds w1 x3-232
dl w1 x2-228  , ds w1 x3-228  , dl w1 x2-224  , ds w1 x3-224
dl w1 x2-220  , ds w1 x3-220  , dl w1 x2-216  , ds w1 x3-216
dl w1 x2-212  , ds w1 x3-212  , dl w1 x2-208  , ds w1 x3-208
dl w1 x2-204  , ds w1 x3-204  , dl w1 x2-200  , ds w1 x3-200
dl w1 x2-196  , ds w1 x3-196  , dl w1 x2-192  , ds w1 x3-192
dl w1 x2-188  , ds w1 x3-188  , dl w1 x2-184  , ds w1 x3-184
dl w1 x2-180  , ds w1 x3-180  , dl w1 x2-176  , ds w1 x3-176
dl w1 x2-172  , ds w1 x3-172  , dl w1 x2-168  , ds w1 x3-168
dl w1 x2-164  , ds w1 x3-164  , dl w1 x2-160  , ds w1 x3-160
dl w1 x2-156  , ds w1 x3-156  , dl w1 x2-152  , ds w1 x3-152
dl w1 x2-148  , ds w1 x3-148  , dl w1 x2-144  , ds w1 x3-144
dl w1 x2-140  , ds w1 x3-140  , dl w1 x2-136  , ds w1 x3-136
dl w1 x2-132  , ds w1 x3-132  , dl w1 x2-128  , ds w1 x3-128
dl w1 x2-124  , ds w1 x3-124  , dl w1 x2-120  , ds w1 x3-120
dl w1 x2-116  , ds w1 x3-116  , dl w1 x2-112  , ds w1 x3-112
dl w1 x2-108  , ds w1 x3-108  , dl w1 x2-104  , ds w1 x3-104
dl w1 x2-100  , ds w1 x3-100  , dl w1 x2- 96  , ds w1 x3- 96
dl w1 x2- 92  , ds w1 x3- 92  , dl w1 x2- 88  , ds w1 x3- 88
dl w1 x2- 84  , ds w1 x3- 84  , dl w1 x2- 80  , ds w1 x3- 80
dl w1 x2- 76  , ds w1 x3- 76  , dl w1 x2- 72  , ds w1 x3- 72
dl w1 x2- 68  , ds w1 x3- 68  , dl w1 x2- 64  , ds w1 x3- 64
dl w1 x2- 60  , ds w1 x3- 60  , dl w1 x2- 56  , ds w1 x3- 56
dl w1 x2- 52  , ds w1 x3- 52  , dl w1 x2- 48  , ds w1 x3- 48
dl w1 x2- 44  , ds w1 x3- 44  , dl w1 x2- 40  , ds w1 x3- 40
dl w1 x2- 36  , ds w1 x3- 36  , dl w1 x2- 32  , ds w1 x3- 32
dl w1 x2- 28  , ds w1 x3- 28  , dl w1 x2- 24  , ds w1 x3- 24
dl w1 x2- 20  , ds w1 x3- 20  , dl w1 x2- 16  , ds w1 x3- 16
dl w1 x2- 12  , ds w1 x3- 12  , dl w1 x2-  8  , ds w1 x3-  8
dl w1 x2-  4  , ds w1 x3-  4  , dl w1 x2-  0  , ds w1 x3-  0

g6 = k - g5   ; base of movelist

jl. (g5.+f6 ) ; return to previous segment

     0        ; fill

i0= -504      ; - max number of bytes to be moved in one round
i1=  503      ; max bytes - 1

;this code segment need no alarm text, as no alarms can occur

i.e.          ; end of block for move array
i.e.          ; end of slang segment

; move_text:
g0:  2                 ; first tail: area entry with 2 segments
     0,0,0,0           ; fill
     1<23+e1-e5        ; entry point movetext
     3<18+9<12+19<6,0  ; integer procedure(addr integer,string);
     4<12+e0-e5        ; code proc, start of external list
     2<12+0            ; 2 code segments, bytes in perm core

; move_bytes
g1:  1<23+4            ; modekind=backing store
     0,0,0,0           ; fill
     1<23 + e2-e5      ; entry point for move_bytes on first segment
     1<18+13<12+19<6+19,0;  procedure(addr int,addr int, value int);
      4<12 + e0-e5      ; code proc, start of externallist
     2<12 + 0          ; 2 code segments, bytes in perm core

n.
\f


message initproc
(initproc=set 1
(initproc=slang fpnames type.yes insertproc entry.no  
initproc reserveproc sendmessage waitanswer  getclock ,
 description    nameentry renameentry cpseudoproc)
if ok.no
end
)

;hcø 31-7-72


;b.                 ;fpnames dummy block

b. g1, e20      w.  ;block with names for tails and insertproc

k=10000

s. g6,j46,f7,b15,i10,d3,c1;start of slang segment for procedures
h.

g0=0                ;g0:=no of externals
e20:

g1:  g2  ,  g2      ;head word: rel of last point, rel of last abs word


j13: g0 + 13 , 0    ;RS entry 13, last used
j30: g0 + 30 , 0    ;RS entry 30, saved stack ref, saved w3
j3:  g0 +  3 , 0    ;RS entry  3, reserve stack
j4:  g0 +  4 , 0    ;RS entry  4, take expression
j6:  g0 +  6 , 0    ;RS entry  6, end register expression
j8:  g0 +  8 , 0    ;RS entry  8, end address expression
j12: g0 + 12 , 0    ;RS entry 12, UV
j16: g0 + 16 , 0    ;RS entry 16, segment table base
j21: g0 + 21 , 0    ;RS entry 21, general alarm
j29: g0 + 29 , 0    ;RS entry 29, param alarm
j43:       0 , 1    ;name entry 1.std variable

g2 = k-2-g1         ;end of abs words:=end of points

w.

e0:  g0             ;start external list
      0
     30 04 74,11 00 00
w.
e1:                 ;entry init_proc
     rl. w2 (j13.)  ;w2:=last used
     ds. w3 (j30.)  ;saved stack ref,saved w3
     dl  w1  x2+8   ;take param name
     so  w0  16     ;if string expression then
     jl. w3 (j4.)   ; take expression
     ds. w3 (j30.)  ;saved stack ref ,save w3
     jl. w3  d1.    ;w3:=take string1(name);
     jd 1<11+6      ;monitor call:init_proc
     rl  w1  0      ;w1:= result
     jd 1<11+4      ;process description
     sn  w0  0      ;if not found then
     jl.     i0.    ;goto end;
     rl  w2  74     ;w2:=nametable
     al  w2  x2-2   ;
     jl.     i1.    ;search entry

e2:                 ; entry reserve proc:
     rl. w2 (j13.)  ;w2:=last used
     ds. w3 (j30.)  ;saved stack ref, saved w3
     dl  w1  x2+8   ;take param name
     so  w0  16     ;if string expression then
     jl. w3 (j4.)   ;take expression
     ds. w3 (j30.)  ;save stack ref, save w3
     jl. w3  d1.    ;w3:=takestring1(name);
     jd  1<11+8     ;reserve process
     rl  w1  0      ;w1:=result
     jd  1<11+4     ;process description
     sn  w0  0      ;if -,found then
     jl.     i0.    ;goto end
     rl  w2  74     ;w2:=name table entry
     al  w2  x2-2
i1:  al  w2  x2+2   ;search entry
     rl  w3  x2     ;w3:=addr
     se  w3 (0)     ;if addr=proc descr
     jl.     i1.    ;then
     rs. w3 (j43.)  ;name entry:=addr
i0:  jl.    (j6.)   ;end register expression

e3:                 ;entry send_message
     rl. w2 (j13.)  ;w2:=last used
     ds. w3 (j30.)  ;saved stack ref, saved w3
     dl  w1  x2+12  ;take integer array param message
     ba  w1  0      ;w1:=abs dope address
     rl  w3  x1     ;w3:=lower index-K(K=2)
     wa  w3 (x2+12) ;
     al  w1  x3+2   ;w3:=addr of first element
     rs  w1  x2+10  ;store message addr
     dl  w1  x2+8   ;take param name
     so  w0  16     ;if string expression then
     jl. w3 (j4.)   ;take expression
     ds. w3 (j30.)  ;save stack ref, save w3
     jl. w3  d1.    ;w3:=take string1(name);
     al  w2  x2-6   ;w2:=last used
     rl  w1  x2+10  ;w1:= message address
     rl. w2 (j43.)  ;w2:=name entry
     rl  w0  x3+8   ;if name entry<>0
     sh  w0  0      ;then
     rs  w2  x3+8   ;store name entry
     jd  1<11+16    ;send message
     rl  w1  4      ;w1:=result:=buffer_address
     jl.    (j6.)   ;end register expression

e4:                 ;entry wait answer
     rl. w2 (j13.)  ;w2:=last used
     ds. w3 (j30.)  ;saved stack ref , saved w3
     dl  w1  x2+8   ;take param ba
     so  w0  16     ;if expression then
     jl. w3 (j4.)   ;take expression
     ds. w3 (j30.)  ;save stack ref ,save w3
     rl  w3  x1     ;w3:=ba
     dl  w1  x2+12  ;take integer array parameter answer
     ba  w1  0      ;w1:=abs dope address
     rl  w1  x1     ;w1:=lower index-K(K=2)
     wa  w1 (x2+12) ;
     al  w1  x1+2   ;w1:=addr of first element
     al  w2  x3     ;w2:=ba
     jd  1<11+18    ;wait answer
     rl  w1  0      ;w1:=result
     jl.    (j6.)   ;end register expression

e8:                 ;entry get_clock
     rl. w2 (j13.)  ;w2:=last used
     ds. w3 (j30.)  ;saved stack ref, saved w3
     jd  1<11+36    ;get clock
     jl.    (j6.)   ;end register expression

e9:                 ;entry process description
     rl. w2 (j13.)  ;w2:=last used
     ds. w3 (j30.)  ;saved stack ref, saved w3
     dl  w1  x2+8   ;take param name
     so  w0  16     ;if expression then
     jl. w3 (j4.)   ;take expression
     ds. w3 (j30.)  ;save stack ref, save w3
     jl. w3  d1.    ;w3:=take string1(name);
     jd  1<11+4     ;process description
     rl  w1  0      ;w1:=process description address
     jl.    (j6.)   ;end register expression


; integer procedure rename_entry(old,new);
; string or <any type> array old,new;
; rename_entry:=result of monitor proc;

e11:  rl. w2 (j13.)     ;   w2:=last used;
      ds. w3 (j30.)     ;   saved stack ref, saved w3
      al  w1 -8         ;
      jl. w3 (j3.)      ;   reserve 8 bytes in stack
      ds. w2 (j30.)     ;   saved new stack ref, saved w3
      dl  w1  x2+12     ;   take param: new
      al  w2  x2-8      ;
      so  w0  16        ;   if expr then
      jl. w3 (j4.)      ;   take expression;
      ds. w3 (j30.)     ;   saved stack ref, saved w3
      al  w2  x2+12     ;
      jl. w3  d1.       ;   w3:=take string1(abs result,new.formal1);
      al  w2  x2-18     ;
      dl  w1  x3+2      ;   move name to reserved locations
      ds  w1  x2+2      ;
      dl  w1  x3+6      ;
      ds  w1  x2+6      ;

      dl  w1  x2+16     ;   take param: old
      so  w0  16        ;   if expr then
      jl. w3 (j4.)      ;   take expression;
      ds. w3 (j30.)     ;   saved stack ref, saved w3
      al  w2  x2+8      ;
      jl. w3  d1.       ;   w3:=take string1(abs result,old.formal1);
      al  w2  x2-6      ;
      rs. w2 (j13.)     ;   release reserved locations
      al  w1  x2-8      ;   w1:=abs address of name new;
      jd  1<11+46       ;   rename entry
      rl  w1  0         ;   renameentry:=result;
      jl.    (j6.)      ; end register expr.

; integer procedure c_pseudo_proc(name);
; string or <any type> array name;
; cpseudoproc:=result of monitor proc;

e12:  rl. w2 (j13.)     ;   w2:=last used;
      ds. w3 (j30.)     ;   saved stack ref, saved w3
      dl  w1  x2+8      ;   take formals: name
      so  w0  16        ;   if expr then
      jl. w3 (j4.)      ;   take expression;
      ds. w3 (j30.)     ;   saved stack ref, saved w3
      al  w2  x2+6      ;
      jl. w3  d1.       ;   w3:=take string1(name);
      jd  1<11+80       ;   create pseudo process
      rl  w1  0         ;   cpseudoproc:=result;
      jl.    (j6.)      ;   end register expr.
p.<:takestring:>
w.
b7:   0,
b8:   0,r.7

m.   end code of this segment
h.    0,r.(:10504-k:) w.
<:messproc   <0>:>
e.                  ;end slang segment


;init_proc:
g0: 1               ;first tail: area with 1 segment
    0,0,0,0         ;fill
    1<23+e1-e20     ;entry point init_proc
    3<18+19<12+41<6,0;integer procedure(string,address integer);
    4<12+e0-e20     ;code proc start of external
    1<12+02         ;1 code segment

;reserve_proc:
    1<23+4          ;modekind=backing store
    0,0,0,0         ;fill
    1<23+e2-e20     ;entry point reserve_proc
    3<18+19<12+41<6,0;integer procedure(string,address integer);
    4<12+e0-e20     ;code proc , start of external
    1<12+02         ;1 code segment

;send_message:
    1<23+4          ;modekind=backing store
    0,0,0,0         ;fill
    1<23+e3-e20     ;entry point send_message
    3<18+25<12+41<6,0;integer procedure(string,integer array);
    4<12+e0-e20     ;code proc , start of external
    1<12+02         ;1 code segment

;wait_answer:
    1<23+4          ;modekind=backingstore
    0,0,0,0         ;fill
    1<23+e4-e20     ;entry point wait_answer
    3<18+25<12+19<6,0;integer procedure(address integer,integer array);
    4<12+e0-e20     ;code proc , start of external
    1<12+02         ;1 code segment

;get_clock:
    1<23+4         ;modekind=backing store
    0,0,0,0        ;fill
    1<23+e8-e20    ;entry point get_clock
    5<18+0,0       ;long procedure;
    4<12+e0-e20    ;code proc , start of external
    1<12+02        ;1 code segment

;description:
    1<23+4         ;modekind=backing store
    0,0,0,0        ;fill
    1<23+e9-e20    ;entry point description
    3<18+41<12,0    ;integer procedure(string param);
    4<12+e0-e20    ;code proc , start of external
    1<12+02        ;1 code segment

;name entry:
    1<23+4         ;modekind=backing store
    0,0,0,0        ;fill
    1              ;byte address in own permanent core
    9<18+0     ,0  ;integer variable
    4<12           ;code var , start of external
    1<12+02        ;1 code segm, bytes

; renameentry:
      1<23+4            ;    modekind=backing store
      0,0,0,0           ;    fill
      1<23+e11-e20      ;    entry point renameentry
      3<18+41<12+41<6,0 ;    integer procedure(undef,undef);
      4<12+e0-e20       ;    code proc , start of external
      1<12+02           ;    1 code segment , bytes in perm. core

; cpseudoproc:
g1:   1<23+4            ;   modekind=backing store
      0,0,0,0           ;   fill
      1<23+e12-e20      ;   entry point: cpseudoproc
      3<18+41<12,0      ;   integer procedure(undef);
      4<12+e0-e20       ;   code proc, start of external list
      1<12+02           ;   1 code segment, bytes in perm core
n.
\f


message lookupaux
(lookupaux=set 1
(lookupaux=slang fpnames type.yes insertproc entry.no 
 lookupaux clearstat permaux monitorproc procidbit)
if ok.no
end
)



;hcø 19 6 72

;procedure monitor_proc(no,w);
;integer no; integer array w;
;comment makes a call of the monitor procedure given by no
;taking the working register values from  the integer
;array w;



;b.                 ;fpnames dummy block

b. g1, e20      w.  ;block with names for tails and insertproc

k=10000

s. g6,j46,f7,b15,i10,d3;start of slang segment for procedures
h.

g0=0                ;g0:=no of externals
e20:

g1:  g2  ,  g2      ;head word: rel of last point, rel of last abs word


j13: g0 + 13 , 0    ;RS entry 13, last used
j30: g0 + 30 , 0    ;RS entry 30, saved stack ref, saved w3
j3:  g0 +  3 , 0    ;RS entry 3, reserve
j4:  g0 +  4 , 0    ;RS entry  4, take expression
j6:  g0 +  6 , 0    ;RS entry  6, end register expression
j12: g0 + 12 , 0    ;RS entry 12, UV
j16: g0 + 16 , 0    ;RS entry 16, segment table base
j29: g0 + 29 , 0    ;RS entry 29, param alarm

g2 = k-2-g1         ;end of abs words:=end of points

w.

e0:  g0             ;start external list
      0
     80 01 28,14 00 00
b0:  rl  w1  0      ; result:=result monitor proc
     jl.    (j6.)   ; end register expression

b1:  rs. w1  b2.    ; save link
     dl  w1  x3+2   ; move name to reserved locations
     ds  w1  x2+2   ;
     dl  w1  x3+6   ;
     ds  w1  x2+6   ;
     jl.    (b2.)   ; return
b2: 0
w.
e1:                 ;entry lookup_aux
     rl. w2 (j13.)  ;w2:=last used
     ds. w3 (j30.)  ;saved stack ref, saved w3
     dl  w1  x2+16  ; take param tail
     ba  w1  0      ; w1:=abs dope
     rl  w3  x1     ; w3:=lower index - 2
     wa  w3 (x2+16) ;
     al  w1  x3+2   ; w3:=addr first elem
     rs  w1  x2+14  ;
     al  w1  -8     ; reserve 8 bytes in stack
     jl. w3 (j3.)   ;
     ds. w2 (j30.)  ; save stack ref, save w3
     dl  w1  x2+12  ;take param docname
     al  w2  x2-8   ;
     so  w0  16     ;if expression then
     jl. w3 (j4.)   ;take expression
     ds. w3 (j30.)  ;save stack ref,save w3
     al  w2  x2+12  ;
     jl. w3  d1.    ;take param name
     al  w2  x2-18  ;
     jl. w1  b1.    ; move docname
     dl  w1  x2+16  ; take param 1 name
     so  w0  16     ; if expression then
     jl. w3 (j4.)   ; take expression
     ds. w3 (j30.)  ; save stack ref, save w3
     al  w2  x2+8   ;
     jl. w3  d1.    ; w3:=takestring
     al  w2  x2-6   ; release reserved locations
     rs. w2 (j13.)  ;
     rl  w1  x2+14  ; w1:=tail
     al  w2  x2-8   ; w2:=doc
     jd  1<11+86    ; lookup auxillary entry
     jl.     b0.    ;end register expression

e2:                 ;entry clear_stat
     rl. w2 (j13.)  ;w2:=last used
     ds. w3 (j30.)  ;saved stack ref, saved w3
     al  w1  -8     ; reserve 8 bytes in stack
     jl. w3 (j3.)   ;
     ds. w2 (j30.)  ; save stack ref, save w3
     dl  w1  x2+12  ;take param docname
     al  w2  x2-8   ;
     so  w0  16     ;if expression then
     jl. w3 (j4.)   ;take expression
     ds. w3 (j30.)  ;save stack ref,save w3
     al  w2  x2+12  ;
     jl. w3  d1.    ;take param name
     al  w2  x2-18  ;
     jl. w1  b1.    ; move docname
     dl  w1  x2+16  ; take param 1 name
     so  w0  16     ; if expression then
     jl. w3 (j4.)   ; take expression
     ds. w3 (j30.)  ; save stack ref, save w3
     al  w2  x2+8   ;
     jl. w3  d1.    ; w3:=takestring
     al  w2  x2-6   ; release reserved locations
     rs. w2 (j13.)  ;
     al  w2  x2-8   ; w2:=doc
     jd  1<11+88    ; clear statics in auxillary entry
     jl.     b0.    ;end register expression

e4:                 ;entry perm_aux
     rl. w2 (j13.)  ;w2:=last used
     ds. w3 (j30.)  ;saved stack ref, saved w3
     dl  w1  x2+16  ; take param key
     so  w0  16     ; if expression then
     jl. w3 (j4.)   ; take expression
     ds. w3 (j30.)  ; save stack ref, save w3
     rs  w1  x2+14  ;
     al  w1  -8     ; reserve 8 bytes in stack
     jl. w3 (j3.)   ;
     ds. w2 (j30.)  ; save stack ref, save w3
     dl  w1  x2+12  ;take param docname
     al  w2  x2-8   ;
     so  w0  16     ;if expression then
     jl. w3 (j4.)   ;take expression
     ds. w3 (j30.)  ;save stack ref,save w3
     al  w2  x2+12  ;
     jl. w3  d1.    ;take param name
     al  w2  x2-18  ;
     jl. w1  b1.    ; move docname
     dl  w1  x2+16  ; take param 1 name
     so  w0  16     ; if expression then
     jl. w3 (j4.)   ; take expression
     ds. w3 (j30.)  ; save stack ref, save w3
     al  w2  x2+8   ;
     jl. w3  d1.    ; w3:=takestring
     al  w2  x2-6   ; release reserved locations
     rs. w2 (j13.)  ;
     rl  w1  x2+14  ; w1:=key
     al  w2  x2-8   ; w2:=doc
     jd  1<11+90    ; permanent entry in auxillary catalog
     rl  w1  0      ; result:=monitor result
     jl.    (j6.)   ;end register expression

e6:                 ;entry monitor_proc:
     rl. w2 (j13.)  ;w2:=last used
     ds. w3 (j30.)  ;save stack ref, save w3
     dl  w1  x2+8   ;take param no
     so  w0  16     ;if expression then
     jl. w3 (j4.)   ;take expression
     ds. w3 (j30.)  ;save stack ref, save w3
     dl  w1  x2+12  ;take w
     ba  w1  0      ;w1:=abs dope
     rl  w1  x1     ;w1:=lower index-k
     wa  w1 (x2+12) ;w1:=first addr-2
     al  w1  x1+4   ;w1:=first+2
     al  w0  -2048  ;w0:=1<11
     ba  w0 (x2+8)  ;w0:=addr part monitor call
     hs. w0  i6.    ;store addr part
     rl  w0  x1-2   ;w0:=w(1);
     dl  w3  x1+4   ;w3:=w(4);
     rs. w1  i7.    ;save first addr(w)+2;
     rl  w1  x1     ;w1:=w(2);
i6=k+1              ;addr of addr part monitor call
     jd      0      ;monitor call
     rs. w1 (i7.)   ;w(2):=w1
     rl. w1  i7.    ;w1:=first addr(w)+2
     rs  w0  x1-2   ;w(1):=w0;
     ds  w3  x1+4   ;w(4):=w3;
     jl.    (j6.)   ;end address expression
i7:  0              ;save addr(w(1));


; integer procedure procidbit(bitno);
; address integer bitno;
; According to bitno the procedure return with a
; process description address of an internal process.
; If it do not exsist it return with the value 0.

e8:   rl. w2 (j13.)     ;   w2:=last used;
      ds. w3 (j30.)     ;   saved stack ref, saved w3
      dl  w1  x2+8      ;   take param: bitno
      so  w0  16        ;   if expr then
      jl. w3 (j4.)      ;   take expression;
      ds. w3 (j30.)     ;   saved stack ref, saved w3
      rl  w1  x1        ;  
      ns. w1  i9.       ;   j:=bit no count from left;
i9=k+1
      ac  w3  0         ; 
      sl  w3  24        ;   if bitno=0 then
      jl.     i10.      ;   goto STOP;
      sl  w1  0         ;   if bitno.0=0 then
      ba. w3  1         ;   j:=j+1;
      al  w1  74        ;
      wm  w1  6         ;   j:=j*length of internal proc;
      wa  w1 (78)       ;   procidbit:=j+addr of first internal;
      sn  w3  0         ;   if first internal then
      jl.    (j6.)      ;   procidbit:=j;
      rl  w3  x1+2      ;   if internal proc removed then
      sn  w3  0         ; STOP: procidbit:=0;
i10:  al  w1  0         ;
      jl.    (j6.)      ;   end register expr.
p.<:takestring:>
m.   end code of this segment
h.    0,r.(:10504-k:) w.
<:prproc     <0>:>
e.                  ;end slang segment

; lookup_aux
g0: 1               ;first tail: area with 1 segment
    0,0,0,0         ;fill
    1<23+e1-e20     ;entry point read_dev
    3<18+25<12+41<6+41,0;integer procedure(undef,undef,integer array);
    4<12+e0-e20     ;code proc start of external
    1<12            ;1 code segment

;clear_stat
    1<23+4          ;modekind=backing store
    0,0,0,0         ;fill
    1<23+e2-e20     ;entry point clear_stat
    3<18+41<12+41<6,0;undef procedure(undef,undef);
    4<12+e0-e20     ;code proc , start of external
    1<12            ;1 code segment

;perm_aux:
    1<23+4          ;modekind=backing store
    0,0,0,0         ;fill
    1<23+e4-e20     ;entry point perm_aux
    3<18+19<12+41<6+41,0;integer procedure(undef,undef,integer)
    4<12+e0-e20     ;code proc , start of external
    1<12            ;1 code segment

;monitor_proc:
    1<23+4          ;modekind=backing store
    0,0,0,0         ;fill
    1<23+e6-e20     ;entry point monitorproc
    1<18+25<12+19<6,0;procedure(integer, integer array);
    4<12+e0-e20     ;code proc, start external
    1<12            ;1 code segment



; procidbit:
g1:   1<23+4         ;   modekind=backingstore
      0,0,0,0        ;   fill
      1<23+e8-e20    ;   entry point procidbit
      3<18+19<12,0   ;   integer procedure(addr integer);
      4<12+e0-e20    ;   code proc, start of external list
      1<12+00        ;   1 code segment, bytes in perm core
n.
\f


message waitmessage
(waitmessage=set 1
(waitmessage=slang fpnames type.yes insertproc entry.no
waitmessage  modifyint createint startint stopint,
removeproc copyzone includeall)
if ok.no
end
)


;hcø 3-8-72


;b.                 ;fpnames dummy block

b. g1, e20      w.  ;block with names for tails and insertproc

k=10000

s. g6,j46,f7,b15,i10,d3;start of slang segment for procedures
h.

g0=0                ;g0:=no of externals
e20:

g1:  g2  ,  g2      ;head word: rel of last point, rel of last abs word


j13: g0 + 13 , 0    ;RS entry 13, last used
j30: g0 + 30 , 0    ;RS entry 30, saved stack ref, saved w3
j4:  g0 +  4 , 0    ;RS entry  4, take expression
j6:  g0 +  6 , 0    ;RS entry  6, end register expression
j8:  g0 +  8 , 0    ;RS entry  8, end address expression
j12: g0 + 12 , 0    ;RS entry 12, UV
j16: g0 + 16 , 0    ;RS entry 16, segment table base
j21: g0 + 21 , 0    ;RS entry 21, general alarm
j29: g0 + 29 , 0    ;RS entry 29, param alarm

g2 = k-2-g1         ;end of abs words:=end of points

w.

e0:  g0             ;start external list
      0
     03 08 72,17 00 00
b0:  0 , b1: 0,r.4  ;name
b2:  0 , b3: 0,r.9  ;tail
w.
e1:                 ;entry wait_message
     rl. w2 (j13.)  ;w2:=last used
     ds. w3 (j30.)  ;saved stack ref, saved w3
     dl  w1  x2+8   ;take param name
     ba  w1  0      ;w1:=abs dope addr
     rl  w1  x1     ;w1:=lower index-K
     wa  w1 (x2+8)   ;
     al  w3  x1+2   ;w3:=name addr
     dl  w1  x2+16  ;take param message
     ba  w1  0      ;w1:=abs dope addr
     rl  w1  x1     ;w1:=lower index-K
     wa  w1 (x2+16) ;
     al  w1  x1+2   ;w1:=message addr
     jd  1<11+20    ;wait_message
     rl  w1  4      ;w1:=buffer_address
     rl. w2 (j13.)  ;w2:=stack ref
     rl  w3  x2+10  ;w3:=first formal buffer addr
     sz  w3  16     ;if -,expression then
     rs  w0 (x2+12) ;store result
     jl.    (j6.)   ;end register expression

e3:                 ;entry modify_int
     rl. w2 (j13.)  ;w2:=stack ref
     ds. w3 (j30.)  ;save stack ref, save w3
     dl  w1  x2+8   ;take param name
     so  w0  16     ;if expression then
     jl. w3 (j4.)   ;take expression
     ds. w3 (j30.)  ;save stack ref, save w3
     jl. w3  d1.    ;w3:=take string1(name);
     dl  w1  x2+ 6  ;take integer array registers
     ba  w1  0      ;w1:=abs dope
     rl  w1  x1     ;w1:=lower
     wa  w1 (x2+ 6) ;
     al  w1  x1+2   ;w1:=first addr
     jd  1<11+62    ;modify_int
     rl  w1  0      ;w1:=result
     jl.    (j6.)   ;end register expression

e4:                 ;entry create_int
     rl. w2 (j13.)  ;w2:=last used
     ds. w3 (j30.)  ;save stack ref,save w3
     dl  w1  x2+8   ;take param name
     so  w0  16     ;if expression then
     jl. w3 (j4.)   ;take expression
     ds. w3 (j30.)  ;save stack ref, save w3
     jl. w3  d1.    ;w3:=takestring1(name);
     al  w2  x2-6   ;w2:=last used
     dl  w1  x2+12  ;take param param
     ba  w1  0      ;w1:=abs dope addr
     rl  w1  x1     ;w1:=lower index-K(K=2)
     wa  w1 (x2+12) ;
     al  w1  x1+2   ;w1:=first addr
     jd  1<11+56    ;create_int
     rl  w1  0      ;w1:=result
     jl.    (j6.)   ;end register expression

e5:                 ;entry start_int
     rl. w2 (j13.)  ;w2:=last used
     ds. w3 (j30.)  ;saved stack ref , saved w3
     dl  w1  x2+8   ;take param name
     so  w0  16     ;if expr then
     jl. w3 (j4.)   ;goto RS take expression
     ds. w3 (j30.)  ;saved stack ref,saved w3
     jl. w3  d1.    ;w3:=take string1(name);
     jd  1<11+58    ;start_int
     rl  w1  0      ;w1:=result
     jl.    (j6.)   ;end register expression

e6:                 ;entry stop_internal
     rl. w2 (j13.)  ;w2:=last used
     ds. w3 (j30.)  ;save stack ref, save w3
     dl  w1  x2+8   ;tape param name
     so  w0  16     ;if expression then
     jl. w3 (j4.) ;take expression
     ds. w3 (j30.)  ;save stack ref, save w3
     jl. w3  d1.    ;w3:=take string1(name);
     jd  1<11+60    ;stop internal process
     rl  w1  4      ;w1:=buffer_address
     rl. w2 (j13.)  ;w2:=stack ref
     rs  w0 (x2+12) ;store result
     jl.    (j6.)   ;end register expression

e7:                 ;entry remove_proc
     rl. w2 (j13.)  ;w2:=stack ref
     ds. w3 (j30.)  ;save stack ref, save w3
     dl w1  x2+8  ;take param name
     so  w0  16     ;if expression then
     jl. w3 (j4.)   ;take expression
     ds. w3 (j30.)  ;save stack ref, save w3
     jl. w3  d1.    ;w3:=takestring1(name);

     jd  1<11+64    ;remove process
     rl  w1  0      ;w1:=result
     jl.    (j6.)   ;end register expression

e8:                 ;entry copy_zone
     rl. w2 (j13.)  ;w2:=last used
     ds. w3 (j30.)  ;save stack ref,save w3
     dl  w1  x2+8   ;take buffer_addr
     so  w0  16     ;if expression then
     jl. w3 (j4.)   ;take expression
     ds. w3 (j30.)  ;save stack ref,save w3
     dl  w1  x2+12  ;take param first
     so  w0  16     ;if expression then
     jl. w3 (j4.)   ;take expression
     ds. w3 (j30.)  ;save stack ref, save w3
     dl  w1  x2+16  ;take param last
     so  w0  16     ;if expression then
     jl. w3 (j4.)   ;goto RS take expression
     ds. w3 (j30.)  ;save stack ref, save w3
     rl  w3  x1     ;w3:=last
     rl  w1 (x2+12) ;w1:=first
     rl  w2 (x2+8)  ;w2:=buffer_address
     jd  1<11+70    ;copy
     rl. w2 (j13.)  ;w2:=last used
     rs  w1 (x2+12) ;save bytes
     rs  w3 (x2+16) ;save chars
     rl  w1  0      ;w1:=result
     jl.    (j6.)   ;end register expression

e9:                 ;entry include_all
     rl. w2 (j13.)  ;w2:=last used
     ds. w3 (j30.)  ;saved stack ref, saved w3
     dl  w1  x2+8   ;take param name
     so  w0  16     ;if expression then
     jl. w3 (j4.)   ;goto RS take expression
     ds. w3 (j30.)  ;saved stack ref, saved w3
     jl. w3 d1.     ;w3:=takestring1(name);
     rl  w1  76     ;w1:=
     ws  w1  74     ;no of
     ls  w1  -1     ;devices
i2:                 ;include
     jd  1<11+12    ;include user
     al  w1  x1-1   ;devno:=devno-1;
     sl  w1  0      ;if devno>=0 then
     jl.     i2.    ;goto include
     jl.    (j8.)   ;end address expression
p.<:takestring:>
b11: 0, b12: 0     ;zeroes
b13: 0, b14: 0      ;work area item
b15:  2.11111       ;kind mask
m.   end code of this segment
h.    0,r.(:10504-k:) w.
<:opsproc    <0>:>
e.                  ;end slang segment


;wait_message:
g0: 1               ;first tail: area with 1 segment
    0,0,0,0         ;fill
    1<23+e1-e20     ;entry point wait_message
    3<18+25<12+19<6+41,0;integer procedure(undef,integer,integer array);
    4<12+e0-e20     ;code proc start of external
    1<12            ;1 code segment

;modify_int:
    1<23+4          ;modekind=backing store
    0,0,0,0         ;fill
    1<23+e3-e20     ;entry point modify_int
    3<18+25<12+41<6,0;integer procedure(undef,integer);
    4<12+e0-e20     ;code proc , start of external
    1<12            ;1 code segment

;create_int:
    1<23+4          ;modekind=backing store
    0,0,0,0         ;fill
    1<23+e4-e20     ;entry point create_int
    3<18+25<12+41<6,0;integer procedure(undef,value integer);
    4<12+e0-e20     ;code proc , start of external
    1<12            ;1 code segment

;start_int:
    1<23+4          ;modekind=backingstore
    0,0,0,0         ;fill
    1<23+e5-e20     ;entry point start_int
    3<18+41<12,0;integer procedure(undef);
    4<12+e0-e20     ;code proc , start of external
    1<12            ;1 code segment

;stop_internal:
    1<23+4          ;modekind=backing store
    0,0,0,0         ;fill
    1<23+e6-e20     ;entry point stop_internal
    3<18+19<12+41<6,0;integer procedure(undef,integer);
    4<12+e0-e20     ;code proc , start external
    1<12            ;1 code segment

;remove_proc:
    1<23+4          ;modekind=backing store
    0,0,0,0         ;fill
    1<23+e7-e20     ;entry point remove_proc
    3<18+41<12,0    ;integer procedure(undef);
    4<12+e0-e20     ;code proc , start external
    1<12            ;1 code segment

;copy_zone:
    1<23+4          ;modekind=backing store
    0,0,0,0         ;fill
    1<23+e8-e20     ;entry point copy_zone
    3<18+19<12+19<6+19,0;integer procedure(int,int,int);
    4<12+e0-e20     ;code proc , start external
    1<12            ;1 code segment

;include_all:
g1: 1<23+4          ;modekind=backing store
    0,0,0,0         ;fill
    1<23+e9-e20     ;entry point remove entry
    1<18+41<12 ,0   ;integer procedure(string);
    4<12+e0-e20     ;code proc , start of external
    1<12            ;1 code segm, bytes
n.
\f


message byteload
(byteload=set 1
(byteload=slang fpnames type.yes insertproc entry.no
byteload shortload wordload doubleload bytestore ,
 wordstore doublestore firstaddr integerand integerneg ,
 nameload  cleararray  setbit integeror)
if ok.no
end
)


;hcø 31-7-72



;b.                 ;fpnames dummy block

b. g1, e20 w.       ;block with names for tails and insertproc

k=10000

s. g6,j46,f7,b15,i4 ;start of slang segment for procedures
h.

g0=0                ;g0:=no of externals
e20:

g1:  g2  ,  g2      ;head word: rel of last point, rel of last abs word


j13: g0 + 13 , 0    ;RS entry 13, last used
j30: g0 + 30 , 0    ;RS entry 30, saved stack ref, saved w3
j4:  g0 +  4 , 0    ;RS entry  4, take expression
j6:  g0 +  6 , 0    ;RS entry  6, end register expression
j8:  g0 +  8 , 0    ;RS entry  8, end address expression
j29: g0 + 29 , 0    ;RS entry 29, param alarm

g2 = k-2-g1         ;end of abs words:=end of points

w.

e0:  g0             ;start external list
      0
     31 07 72,18 00 00
w.
e1:                 ;entry byte_load
     rl. w2 (j13.)  ;w2:=last used
     ds. w3 (j30.)  ;saved stack ref, saved w3
     dl  w1  x2+8   ;take integer param
     so  w0  16     ;if expression then
     jl. w3 (j4.)   ;take expression
     ds. w3 (j30.)  ;save stack ref, save w3
     rl  w1  x1     ;w1:=addr
     bz  w1  x1     ;w1:=byte;
     jl.    (j6.)   ;end register expression

e2:                 ;entry short_load
     rl. w2 (j13.)  ;w2:=last used
     ds. w3 (j30.)  ;saved stack ref, saved w3
     dl  w1  x2+8   ;take integer param
     so  w0  16     ;if expr then
     jl. w3 (j4.)   ;take expression
     ds. w3 (j30.)  ;save stack ref, save w3
     rl  w1  x1     ;w1:=addr
     bl  w1  x1     ;w1:=extended byte
     jl.    (j6.)   ;end register expression

e3:                 ;entry word_load
     rl. w2 (j13.)  ;w2:=last used
     ds. w3 (j30.)  ;saved stack ref , saved w3
     dl  w1  x2+8   ;take integer param addr
     so  w0  16     ;if expr then
     jl. w3 (j4.)   ;goto RS take expression
     ds. w3 (j30.)  ;saved stack ref,saved w3
     rl  w1  x1     ;w1:=addr
     rl  w1  x1     ;w1:=word
     jl.    (j6.)   ;end register expression

e4:                 ;entry double_load
     rl. w2 (j13.)  ;w2:=last used
     ds. w3 (j30.)  ;saved stack ref, saved w3
     dl  w1  x2+8   ;take integer param
     so  w0  16     ;if expression then
     jl. w3 (j4.)   ;goto RS take expression
     ds. w3 (j30.)  ;saved stack ref, saved w3
     rl  w1  x1     ;w1:= address
     dl  w1  x1     ;w1w0:=double word
     jl.    (j6.)   ;end register expression

e5:                 ;entry byte_store
     rl. w2 (j13.)  ;w2:=last used
     ds. w3 (j30.)  ;saved stack ref, saved w3
     dl  w1  x2+8   ;take integer param addr
     so  w0  16     ;if expression then
     jl. w3 (j4.)   ;take expression
     rs  w1  x2+8   ;store addr
     dl  w1  x2+12  ;take integer param byte
     so  w0  16     ;if expression then
     jl. w3 (j4.)   ;take expression
     ds. w3 (j30.)  ;save stack ref, save w3
     rl  w0  x1     ;w0:=byte
     rl  w1 (x2+8)  ;w1:=addr
     hs  w0  x1     ;store byte
     jl.    (j8.)   ;end address expression

e6:                 ;entry word_store
     rl. w2 (j13.)  ;w2:=last used
     ds. w3 (j30.)  ;saved stack ref, saved w3
     dl  w1  x2+8   ;take param
     so  w0  16     ;if expression then
     jl. w3 (j4.)   ;take expression
     ds. w3 (j30.)  ;save stack ref, save w3
     rs  w1  x2+8   ;store addr
     dl  w1  x2+12  ;take integer param word
     so  w0  16     ;if expression then
     jl. w3 (j4.)   ;take expression
     ds. w3 (j30.)  ;save stack ref, save w3
     rl  w0  x1     ;w0:=word
     rl  w1 (x2+8)  ;w1:=addr
     rs  w0  x1     ;store word
     jl.    (j8.)   ;end address expression

e7:                 ;entry double_store
     rl. w2 (j13.)  ;w2:=last used
     ds. w3 (j30.)  ;saved stack ref, saved w3
     dl  w1  x2+8   ;take integer param addr
     so  w0  16     ;if expression then
     jl. w3 (j4.)   ;take expression
     ds. w3 (j30.)  ;save stack ref, save w3
     rs  w1  x2+8   ;store addr
     dl  w1  x2+12  ;take long param double
     so  w0  16     ;if expression then
     jl. w3 (j4.)   ;take expression
     ds. w3 (j30.)  ;save stack ref, save w3
     dl  w0  x1     ;w0w3:=double
     rl  w1 (x2+8)  ;w1:=addr
     ds  w0  x1     ;store double
     jl.    (j8.)   ;end address expression

e8:                 ;entry first_addr
     rl. w2 (j13.)  ;w2:=last used
     ds. w3 (j30.)  ;saved stack ref, saved w3
     dl  w1  x2+8   ;take param
     al  w3  2.11111;w3:=check mask
     la  w3  0      ;kind:=bits(19:23).formal1
     sn  w3  23     ;if kind=zone then
     al  w3  19     ;kind=real array
     sh  w3  22     ;if kind>22 then begin
     jl.     i2.
     rl  w1  x2+8   ;first_addr:=addr(variable);
     jl.    (j6.)   ;end register expression
i2:  sh  w3  16     ;kind<17 then
     jl. w3 (j29.)  ;param alarm
     ba  w1  0      ;w1:=abs dope addr
     rl  w3  x1     ;w3:=lower index-K(K=2)
     wa  w3 (x2+8)  ;
     al  w1  x3+2   ;w1:=abs addr first element
     jl.    (j6.)   ;end register expression

e9:                 ;entry integerand:
     rl. w2 (j13.)  ;w2:=last used
     ds. w3 (j30.)  ;saved stack ref, saved w3
     dl  w1  x2+8   ;take integer param i1
     so  w0  16     ;if expression then
     jl. w3 (j4.)   ;goto RS take expression
     ds. w3 (j30.)  ;saved stack ref, saved w3
     rs  w1  x2+8   ;store i1
     dl  w1  x2+12  ;take integer param i2
     so  w0  16     ;if expression then
     jl. w3 (j4.)   ;goto RS take expression
     ds. w3 (j30.)  ;saved stack ref, saved w3
     rl  w1 (x2+12) ;w1:=i2
     la  w1 (x2+8)  ;w1:=i1 and i2
     jl.    (j6.)   ;end register expression

e10:                ;entry integerneg:
     rl. w2 (j13.)  ;w2:=last used
     ds. w3 (j30.)  ;saved stack ref, saved w3
     dl  w1  x2+8   ;take integer param i
     so  w0  16     ;if expression then
     jl. w3 (j4.)   ;take expression
     ds. w3 (j30.)  ;saved stack ref, saved w3
     rl  w1  x1     ;w1:=i
     lx. w1 b10.    ;i:=-,i
     jl.    (j6.)   ;end register expression

e11:                ;entry  name_load
     rl. w2 (j13.)  ;w2:=last used
     ds. w3 (j30.)  ;save stack ref, save w3
     dl  w1  x2+8   ;take param addr
     so  w0  16     ;if expression then
     jl. w3 (j4.)   ;take expression
     ds. w3 (j30.)  ;save stack ref , save w3
     rl  w3  x1     ;w3:=addr
     dl  w1  x2+12  ;take param a
     la. w0  b11.   ;w0:=kind
     sh  w0  23     ;if kind=zone then
     al  w0  19     ;kind:=array
     sh  w0  20     ;if kind=variable or
     sh  w0  16     ;kind=expression or procedure then
     jl. w3 (j29.)  ;goto param alarm
     ba  w1  x2+10  ;w1:=dope addr
     rl  w0  x1-2   ;w0:=lower index
     ws  w0  x1     ;
     rl  w1  x1     ;w1:=first addr - K
     wa  w1 (x2+12) ;w1:=first addr
     rl  w2  2      ;w2:=first addr
     dl  w1  x3+2   ;get first double
     ds  w1  x2+4   ;store first double
     dl  w1  x3+6   ;get last double
     ds  w1  x2+8   ;store last double
     jl.    (j8.)   ;end address expression
c.-1

e12:                ;entry i_o:
     rl. w2 (j13.)  ;w2:=last used
     ds. w3 (j30.)  ;save stack ref, save w3
     dl  w1  x2+8   ;take param dev_no
     so  w0  16     ;if expression then
     jl. w3 (j4.)   ;take expression
     ds. w3 (j30.)  ;save stack ref, save w3
     dl  w1  x2+12  ;take param command
     so  w0  16     ;if expression then
     jl. w3 (j4.)   ;take expression
     ds. w3 (j30.)  ;save stack ref, save w3
     dl  w1  x2+16  ;take param data
     so  w0  16     ;if expression then
     jl. w3 (j4.)   ;goto take expression
     ds. w3 (j30.)  ;save stack ref, save w3
     rl  w0  x1     ;w0:=data
     rl  w1 (x2+8)  ;w1:=dev_no
     ls  w1  6      ;devno:=devno shift 6
     lo  w1 (x2+12) ;or command
     io  w0  x1     ;io commando (pr 0 pk 0)
     rs  w0 (x2+16) ;store data
     xs      3      ;w1:=exseption
     la. w1  i0.    ;w1:=busy or disconnect
     jl.    (j6.)   ;end register expression
i0:  2.11           ;mask
z.

e13:                ;entry clear array:
     rl. w2 (j13.)  ;w2:=last used
     ds. w3 (j30.)  ;save stack ref, save w3
     dl  w1  x2+8   ;take param a
     la. w0  b11.   ;w0:=kind
     sh  w0  23     ;if kind=zone then
     al  w0  19     ;kind:=array
     sh  w0  20     ;if kind=variable or
     sh  w0  16     ;kind=procedure or expression then
     jl. w3 (j29.)  ;goto RS param alarm
     ba  w1  x2+6   ;w1:=abs dope addr
     rl  w3  x1     ;w3:=lower-K
     wa  w3 (x2+8)  ;
     al  w3  x3+2   ;w3:=first
     rl  w1  x1-2   ;w1:=upper
     wa  w1 (x2+8)  ;w1:=last
     al  w0  0      ;w0:=0;
i1:                 ;loop
     rs  w0  x3     ;a(i):=0;
     al  w3  x3+2   ;i:=i+1;
     sh  w3  x1+1  ;if i>upper then
     jl.     i1.    ;goto loop else
     jl.    (j8.)   ;end address expression

e15:                ;entry set_bit:
     rl. w2 (j13.)  ;w2:=last used
     ds. w3 (j30.)  ;save stack ref, save w3
     dl  w1  x2+8   ;take param word
     so  w0  16     ;if expression then
     jl. w3 (j4.)   ;take expression
     ds. w3 (j30.)  ;save stack ref, save w3
     dl  w1  x2+12  ;take param bitno
     so  w0  16     ;if expression then
     jl. w3 (j4.)   ;take expression
     ds. w3 (j30.)  ;save stack ref, save w3
     dl  w1  x2+16  ;take param bit
     so  w0  16     ;if expression then
     jl. w3 (j4.)   ;take expression
     ds. w3 (j30.)  ;save stack ref, save w3
     rl  w1  x1     ;w1:=bitvalue
     se  w1  0      ;if bitvalue=1 then 
     jl.     i3.    ;goto set
     al  w1  1      ;clear:
     rl  w3 (x2+12) ;shift 
     ls  w1  x3     ;shift bit
     al  w3  -1
     lx  w1  6      ;w1:=-,shift bit
     la  w1 (x2+8)  ;word and w1
     jl.    (j6.)   ;end register expression
i3:  rl  w3 (x2+12) ;shift 
     ls  w1  x3     ;shift bit
     lo  w1 (x2+8)  ;result:=word or bitmask
     jl.    (j6.)   ;end register expression


e16:                ;entry integer_or:
     rl. w2 (j13.)  ;w2:=last used;
     ds. w3 (j30.)  ;saved stack ref, saved w3
     dl  w1  x2+8     ;take param i1
     so  w0  16     ;if expr then
     jl. w3 (j4.)   ;take expression;
     ds. w3 (j30.)  ;saved stack ref, saved w3
     rs  w1  x2+8   ;saved param i1
     dl  w1  x2+12  ;take param i2
     so  w0  16     ;if expr then
     jl. w3 (j4.)   ;take expression;
     ds. w3 (j30.)  ;saved stack ref, saved w3
     rl  w1  x1     ;
     lo  w1 (x2+8)  ;integeror:=i1 <logical or> i2;
     jl.    (j6.)   ;end register expr.

b10: -1
b11:      2.11111   ;array mask
m.   end code of this segment
h.    0,r.(:10504-k:) w.
<:registerpro<0>:>
e.                  ;end slang segment


;byte_load:
g0: 1               ;first tail: area with 1 segment
    0,0,0,0         ;fill
    1<23+e1-e20     ;entry point byte_load
    3<18+19<12,0    ;integer procedure(address integer);
    4<12+e0-e20     ;code proc start of external
    1<12            ;1 code segment

;short_load:
    1<23+4          ;modekind=backing store
    0,0,0,0         ;fill
    1<23+e2-e20     ;entry point short_load
    3<18+19<12,0    ;integer procedure(address integer);
    4<12+e0-e20     ;code proc , start of external
    1<12            ;1 code segment

;word_load:
    1<23+4          ;modekind=backingstore
    0,0,0,0         ;fill
    1<23+e3-e20     ;entry point word_load
    3<18+19<12,0    ;integer procedure(address integer);
    4<12+e0-e20     ;code proc , start of external
    1<12            ;1 code segment

;double_load:
    1<23+4          ;modekind=backing store
    0,0,0,0         ;fill
    1<23+e4-e20     ;entry point double_load
    5<18+19<12,0    ;long procedure(address integer);
    4<12+e0-e20     ;code proc , start of external
    1<12            ;1 code segment

;byte_store:
    1<23+4          ;modekind=backing store
    0,0,0,0         ;fill
    1<23+e5-e20     ;entry point byte_store
    1<18+19<12+19<6,0;procedure(address integer,address integer);
    4<12+e0-e20     ;code proc , start of external
    1<12            ;1 code segment

;word_store:
    1<23+4          ;modekind=backing store
    0,0,0,0         ;fill
    1<23+e6-e20     ;entry point word_store
    1<18+19<12+19<6,0;procedure(address integer,address integer);
    4<12+e0-e20     ;code proc , start of external
    1<12            ;1 code segment

;double_store:
    1<23+4          ;modekind=backing store
    0,0,0,0         ;fill
    1<23+e7-e20     ;entry point double_store
    1<18+21<12+19<6,0;procedure(address integer,address long);
    4<12+e0-e20     ;code proc ext list
    1<12            ;1 code segment

;first_addr:
    1<23+4          ;modekind=backing store
    0,0,0,0         ;fill
    1<23+e8-e20     ;entry point first addr
    3<18+41<12,0    ;integer procedure(undefined);
    4<12+e0-e20     ;code proc , start of external
    1<12            ;1 code segment

;integerand:
    1<23+4          ;modekind=backing store
    0,0,0,0         ;fill
    1<23+e9-e20     ;entry point integerand
    3<18+19<12+19<6,0;integer procedure(value integer,value integer);
    4<12+e0-e20     ;code proc , start of external
    1<12            ;1 code segment

;integerneg:
    1<23+4          ;modekind=backing store
    0,0,0,0         ;fill
    1<23+e10-e20    ;entry point integerneg
    3<18+19<12,0    ;integer procedure(value integer)
    4<12+e0-e20     ;code proc , start of external
    1<12            ;1 code segment
;nameload:
    1<23+4          ;modekind=backing store
    0,0,0,0         ;fill
    1<23+e11-e20    ;entry point name_load
    1<18+41<12+19<6,0;procedure(address integer,undef)
    4<12+e0-e20     ;code proc , start of external
    1<12            ;1 code segment
c.-1


;i_o:
    1<23+4          ;modekind=backing store
    0,0,0,0         ;fill
    1<23+e12-e20    ;entry point i_o
    3<18+19<12+19<6+19,0;integer procedure(int,int,int);
    4<12+e0-e20     ;code proc, start external
    1<12            ;1 code segment
z.

;clear_array:
    1<23+4          ;modekind=backing store
    0,0,0,0         ;fill
    1<23+e13-e20    ;entry point clear_array
    1<18+41<12,0    ;procedure(undef);
    4<12+e0-e20     ;code proc, start external
    1<12            ;1 code segment

;set_bit:
    1<23+4          ;modekind=backing store
    0,0,0,0         ;fill
    1<23+e15-e20    ;entry point set_bit
    3<18+19<12+19<6+19,0;integer procedure(int, int, int);
    4<12+e0-e20     ;code proc, start external
    1<12            ;1 code segment

;integer_or:
g1: 1<23+4          ;modekind=backingstore
    0,0,0,0         ;fill
    1<23+e16-e20    ;entry point integer_or
    3<18+19<12+19<6 ;integer procedure(address integer,
     0              ;          address integer);
    4<12+e0-e20     ;code proc, start of external
    1<12            ;1 code segment

;end
n.
\f


(message scopepro
scopepro=set 1 
(scopepro=slang fpnames list.no type.yes insertproc  entry.no 
            scopepro scopeuser)
if ok.no
end
message slang ok
)
;b.                     ;fpnames dummyblock
b.  g1, e20         w.  ;block with names for tail and insertproc

k=10000

s. g2,b4,j45,i5,h4,d1   ;start of slang segment for procedures
h.

g0=0                    ;g0:= no of externals
e20:

g1:     g2   ,  g2      ;head word: rel of last point, rel of last abs word

j4:     g0 +  4, 0      ;RS entry 4, take expression
j6:     g0 +  6, 0      ;RS entry 6, end register expression
j12:    g0 + 12, 0      ;Rs entry 12, uv
j13:    g0 + 13, 0      ;RS entry 13, last used
j16:    g0 + 16, 0      ;RS entry 16, segment table base
j29:    g0 + 29, 0      ;RS entry 29, param alarm
j30:    g0 + 30, 0      ;RS entry 30, saved stack ref, saved w3
j42:    g0 + 42, 0      ;RS entry 42, victim (start of RS-table)

g2 = k-2-g1             ; end of abs words:= end of points

w.
e0:    g0               ;start externals list
        0
       30 08 78,15 00 00
b2:   8
b3:  16                 ;
b4:   24                ;
h0: 0, h1: 0,r.9        ;tail address
h2: 0                   ; name address
h3: 0,r.10              ;
h4: <:drum:>,0,0,0          ;
p.<:takestring:>


w.

;integer procedure scope_pro(name)
;the procedure change the permkey of the entry specifided by the name
;to 3,and change the base so that they follow standard.
e1:       rl. w2 (j13.)  ;w2:=last used
          ds. w3 (j30.)  ;save stack ref save w3
          dl  w1  x2+8   ;get param name
          so  w0  16     ;if string expression then
          jl. w3 (j4.)  ;
          ds. w3 (j30.)  ;
          jl. w3  d1.    ;w3:=take string1(name);
          al w1  3       ;permkey:=3
          jd 1<11+50     ;permentry
          se  w0 0       ;if result not ok then
          jl.    i0.     ; end register expression
          al. w1  h0.    ;w1:=tail address
          jd  1<11+42    ;lookup entry
          sn  w0  0      ;if result not ok then
          jl.     i1.    ;
          wa. w0  b3.    ;result:=result+16;
          jl.     i0.    ;
i1:       rl. w2  h0.    ;w2:=size
          sl  w2   0     ;if size <  0 then perm entry in auxcat
          jl.     i3.    ;
          dl. w1  h4.+2  ; docname:=drum
          ds. w1  h3.+4  ;
          dl. w1  h4.+6  ;
          ds. w1  h3.+8  ;
          rs. w3  h2.    ; save w3
          al. w3  h1.
          al. w1  h3.    ; w2:= name
          jd 1 < 11 + 42 ; lookup up entry
          rl. w3  h2.    ;
          rl. w2  h3.+2  ; w2:=docname address
          al  w1  3      ;w1:=permkey
          jd 1<11+90     ;permentry in auxcat
          sn  w0   0     ;
          jl.     i3.    ;end register expression
          wa. w0  b4.    ;
          jl.     i0.    ;
i3:       rl  w1  66     ;w1:=current process
          dl  w1  x1+74  ;set max bese
          jd 1<11+74     ;set entry base
          se  w0  0      ;if result not ok then
          wa.  w0  b2.  ;result:=result+8
i0:       rl  w1  0      ; w1:=result
          jl.    (j6.)   ; end register expression

;integer procedure scope_user(name)
;the procedure change the permkey of the entry specifided by the name
;to 3,and change the base so that they follow standard.
e2:       rl. w2 (j13.)  ;w2:=last used
          ds. w3 (j30.)  ;save stack ref save w3
          dl  w1  x2+8   ;get param name
          so  w0  16     ;if string expression then
          jl. w3 (j4.)   ;take expression
          ds. w3 (j30.)  ;
          jl. w3  d1.    ;w3:=take string1(name);
          al w1  3       ;permkey:=3
          jd 1<11+50     ;permentry
          se  w0 0       ;if result not ok then
          jl.    i0.     ; end register expression
          al. w1  h0.    ;w1:=tail address
          jd  1<11+42    ;lookup entry
          sn  w0  0      ;if result not ok then
          jl. w0  i4.    ;
          wa. w0  b3.    ;result:=result+16;
          jl.     i0.    ;
i4:       rl. w2  h0.    ;w2:=size
          sl  w2   0     ;if size <  0 then perm entry in auxcat
          jl.      i5.    ;
          dl. w1 h4.+2   ; docname:=drum
          ds. w1 h3.+4   ;
          dl. w1 h4.+6   ;
          ds. w1 h3.+8   ;
          rs. w3 h2.     ; save w3
          al. w3 h1.     ; w3:= name
          al. w1 h3.     ; w1:=docname
          jd 1 < 11 + 42 ; lookup entry
          rl. w3 h2.     ;
          rl. w2 h3.+2   ;w2:=docname
          al  w1  3      ;w1:=permkey
          jd 1<11+90     ;permentry in auxcat
          sn  w0   0     ;
          jl. w0  i5.    ;end register expression
          wa. w0  b4.    ;
          jl.     i0.    ;
i5:       rl. w2  j42.   ;
          rl  w1   x2+32 ;get base of filprocessor
          rl  w0  x1+h58-2 ;w0:=lower user base
          rl  w1  x1+h58 ;w1:=upper user base
          jd 1<11+74     ;set entry base
          se  w0  0      ;if result not ok then
          wa.  w0  b2.  ;result:=result+8
          jl.      i0.   ;end register expression
w.
m.   end code of this segment

h.   0,r.(:10504-k:) w.
<:scopepro   <0>:>
e.
;scope project
g0:      1              ;first tail: area with 1 segment
       0,0,0,0          ;fill
       1<23+e1-e20      ;entry point scope project.disc
       3<18+41<12,0     ;integer procedure scope_project(name)
       4<12+e0-e20      ;code proc,start of externals
       1<12             ;1 code segment
;scope user
g1:    1<23 +4          ;modekind backingstore
       0,0,0,0          ;fill
       1<23+e2-e20      ;entry point scope user
       3<18+41<12,0     ;integer procedure scope_user(name)
       4<12+e0-e20      ;code proc start of externals
       1<12             ;1 code segment
n.
clear project trapbase lastused console parent
trapbase=set 0 drum 0 576.39 0 4.0 0
lastused=set 0 drum 0 576.13 0 4.0 0
console=set 0 drum 0 576.38 0 4.0 0
parent=set 0 drum 0 576.41 0 4.0 0
scope project.drum trapbase lastused console parent
\f


(message setcatbase
setcatbase=set 1
(setcatbase=slang fpnames list.no type.yes insertproc  entry.no 
            setcatbase setenbase setbsclaims,
            scopetemp scopelogin  )
if ok.no
end
message slang ok
)
;b.                     ;fpnames dummyblock
b.  g1, e20         w.  ;block with names for tail and insertproc

k=10000

s. g2,b3,j45,i3,h3,d1   ;start of slang segment for procedures
h.

g0=0                    ;g0:= no of externals
e20:

g1:     g2   ,  g2      ;head word: rel of last point, rel of last abs word

j4:     g0 +  4, 0      ;RS entry 4, take expression
j6:     g0 +  6, 0      ;RS entry 6, end register expression
j12:    g0 + 12, 0      ;Rs entry 12, uv
j13:    g0 + 13, 0      ;RS entry 13, last used
j16:    g0 + 16, 0      ;RS entry 16, segment table base
j29:    g0 + 29, 0      ;RS entry 29, param alarm
j30:    g0 + 30, 0      ;RS entry 30, saved stack ref, saved w3
j42:    g0 + 42, 0      ;RS entry 42, victim (start of RS-table)

g2 = k-2-g1             ; end of abs words:= end of points

w.
e0:    g0               ;start externals list
        0
       30 08 78,15 00 00
b2:   8
b3:  16                 ;
h0: 0, h1: 0,r.9        ;tail address
p.<:takestring:>


w.
i0:     rl  w1  0       ;  w1:= result
        jl.    (j6.)    ;  end register expression


;integer procedure set_cat_base(name,lower base,upper base)
;The procedure changes the catalog base of an intenal process.
e1:    
        rl. w2 (j13.)   ;w2:= last used
        ds. w3 (j30.)   ;save stack ref, save w3
        dl  w1  x2+8    ;take param name

        so  w0  16      ;if string expression then
        jl. w3 (j4.)    ;take expression
        ds. w3 (j30.)   ;save stack ref, save w3
        jl. w3  d1.     ;w3:=takestring1(name);
        al  w2  x2-6    ;
        rs  w3  x2+8    ;b0:=name adress
        dl  w1  x2+12   ;take param lower base
        so  w0  16      ;if expr then
        jl. w3 (j4.)    ;take expression
        ds. w3 (j30.)   ;save stack ref,save w3
        rs  w1  x2+12   ;w1:=lower base
        dl  w1 x2+16    ;take param upper base
        so  w0  16      ;if expression then
        jl. w3 (j4.)    ;take expression
        ds. w3 (j30.)   ;save stack ref,save w3
        rl  w3  x2+8    ;w3:=name adress
        rl  w0  (x2+12) ;w1:=lower base
        rl w1  x1       ;
        jd 1<11+72      ;set_catalog base
        jl.      i0.    ;end register expression

;integer procedure set_entry_base(name,lower_base,upper_base)
;The procedure will set the base of main catalog entry specified
;by the name, provided the entry is not projected against the calling
;process.
e2:     rl. w2 (j13.)   ;w2:=last used
        ds. w3 (j30.)   ;save stack ref,save w3
        dl  w1  x2+8    ;take param name
        so  w0  16      ;if string expression then
        jl. w3 (j4.)    ;take expression
        ds. w3 (j30.)   ;save stack ref,save w3
        jl. w3  d1.     ;w3:=take string1(name);
        al  w2  x2-6    ;
        rs  w3  x2+8    ;b0:=name adress
        dl  w1  x2+12   ;take param lower base
        so  w0  16      ;if expression then
        jl. w3 (j4.)    ;take expression
        ds. w3 (j30.)   ;save stack ref,save w3
        rs  w1  x2+12   ;b1:=adress of lower base
        dl  w1 x2+16    ;take param upper base
        so  w0 16       ;if expression then
        jl. w3 (j4.)    ;take expression
        ds. w3 (j30.)   ;save stack ref ,save w3

        rl   w3  x2+8   ;w3:=name adress
        rl    w0 (x2+12);w0:=lower base
        rl  w1  x1      ;
        jd  1<11+74     ;set catalog entry
        jl.      i0.    ;end register expression

;integer procedure set_backings_claims(name,documentname,claimlistadres)
;The procedure will transfer backing storage claims,corresponding to
;the document specified by the document name, between the calling process
;and the process specified by the process name.
e3:      rl. w2 (j13.)  ;w2:= last used
         ds. w3 (j30.)  ;save stack ref ,save w3
         dl  w1  x2+8   ;take param name
         so  w0  16     ;if string expression then
         jl. w3 (j4.)   ;take expression
         ds. w3 (j30.)  ;save stack ref, save w3
         jl. w3  d1.    ;w3:=take string1(name);
         al  w2  x2-6   ; w2:=last used
         rs  w3  x2+8   ;save name adress
         dl  w1  x2+12  ;take param document name
         so  w0  16     ;if string expression then
         jl. w3 (j4.)   ;take expression
         ds. w3 (j30.)  ;svae stack ref, save w3
         al  w2  x2+10  ;w2:=first formal
         jl.  w3  d0.   ;takestring
         al   w2  x2-10 ;w2:=last used
         rs   w3  x2+12 ;b1:=document name adress
         dl  w1  x2+16  ; take param integer array
         ba  w1  0      ;w1:=abs dope
         rl  w1  x1     ; w1:=lower index-K
         wa  w1 (x2+16) ;
         al  w1  x1+2   ; w1:=abs address integer array
         rl  w3  x2+8   ; w3:=name adress
         rl  w2  x2+12  ; w2:=document address
         jd 1<11+78     ;set_backings_claim
         rl  w1  0      ;set_backings_claim:= result
         jl.    (j6.)   ;end register expression

;integer procedure scope_temp(name)
;The procedure will change the permkey of the entry specified by name
;to 0, and change the base so that they follow the standard for an tem-
;porary entry.
e4:      rl. w2 (j13.)  ;w2:=last used
         ds. w3 (j30.)  ;svae stack ref, save w3
         dl  w1  x2+8   ;get parameter name
         so  w0 16      ;if string expression
         jl. w3 (j4.)   ;take expression
         ds. w3 (j30.)  ;save stack ref,save w3
         jl. w3 d1.     ;w3:=take string1(name);
          al w1   0     ;permkey:=0;
         jd  1<11+50    ;permentry
         se  w0  0      ;if result not ok then
         jl.    i0.     ;end register expression

          rl  w1 66     ;w1:=current process
          dl  w1  x1+78 ;set standard base
          jd  1<11+74   ;set entry base
          se  w0 0      ;if result not ok then
          wa. w0 b2.     ;result:=result+8;
          jl.     i0.   ;end register expression

;integer procedure scope_login(name);
;The procedure will change the permkey to 2 of the entry specified by the name
;and change the entryes bases so that they follow the standard.
e5:       rl. w2 (j13.) ;w2:=last used
          ds. w3 (j30.) ;save stack ref,save w3
          dl  w1  x2+8  ;get param name
          so  w0  16    ;if string expression then
          jl. w3 (j4.)  ; take expression
          ds. w3 (j30.) ;save stack ref,save w3
          jl. w3  d1.   ;w3:=takestring1(name);
          al  w1  2     ;permkey:= 2;
          jd  1<11+50   ;permentry
          se  w0  0     ;if result not ok then
          jl.    i0.    ;end register expression
          rl  w1 66     ;w1:=current process
          dl  w1  x1+78 ;set std base
          jd  1<11+74   ; set entry base
          se  w0 0      ; if result not ok then
          wa. w0 b2.    ;result:=result+8
          jl.     i0.   ;end register expression 
w.
m.   end code of this segment

h.   0,r.(:10504-k:) w.
<:setcatbase <0>:>
e.

;setcatbase
g0:    1                ;first tail:area with 1 segment
       0,0,0,0          ;fill
       1<23+e1-e20      ;Entry point set catalogbase
       3<18+19<12+19<6+41,0;Integer procedure setcatbase(name,lower,Upper)
       4<12+e0-e20      ;code proc ,start of externals
       1<12             ; 1 code segment
;setentrybase
       1<23+4           ;modekind=backingstore
       0,0,0,0          ;fill
       1<23+e2-e20      ;entry point setentrybase
       3<18+19<12+19<6+41,0;integer procedure setentrybase(name lower upper)
       4<12+e0-e20      ;code proc ,start of externals
       1<12             ;1 code segment
;setbackingstoreclaim
       1<23+4           ;modekind=backingstore
       0,0,0,0          ;fill
       1<23+e3-e20      ;entry point setbackingsclaims
       3<18+25<12+41<6+41,0;integer procedure setbackingsclaim(name,dname,cla
       4<12+e0-e20      ;code proc ,start of externals
       1<12             ;1 code segment
;scope_temp
       1<23+4           ;modekind=backingstore
       0,0,0,0          ;fill
       1<23+e4-e20      ;entry point scopetemp

       3<18+41<12,0     ;integer procedure scope_temp(name)
       4<12+e0-e20      ;code proc, start of externals
       1<12             ;1 code segment
;scope login
g1:    1<23+4           ;modekind=backingstore
       0,0,0,0          ;fill
       1<23+e5-e20      ;entry point scope login
       3<18+41<12,0     ;integr procedure scope_login(name)
       4<12+e0-e20      ;code proc start of externals
       1<12             ;1 code segment
n.
\f


(message changetail
changetail=set 1
(changetail= slang fpnames list.no type.yes insertproc entry.no
              changetail headandtail reservesegm wait,
              sendanswer owndescr)

if ok.no
end
message slang ok
)


;hcø 31-7-72



;b.                 ;fpnames dummy block

b. g1, e20      w.  ;block with names for tails and insertproc

k=10000

s. g6,j48,f7,b15,i10,d3;start of slang segment for procedures
h.

g0=0                ;g0:=no of externals
e20:

g1:  g2  ,  g2      ;head word: rel of last point, rel of last abs word

j4:  g0 + 4 , 0     ;RS entry  4, take expression
j6:  g0 + 6 , 0     ;RS entry  6,end register expression
j8:  g0 + 8  , 0    ;RS entry  8,end address expression
j12: g0 + 12 , 0    ;RS entry 12, UV
j13: g0 + 13 , 0    ;RS entry 13, last used
j16: g0 + 16 , 0    ;RS entry 16, segment table base
j29: g0 + 29 , 0    ;RS entry 29, param alarm
j30: g0 + 30 , 0    ;RS entry 30,saved stack ref, saved w3

g2 = k-2-g1         ;end of abs words:=end of points

w.

e0:  g0             ;start external list
      0
     25 04 73,14 00 00
b0:  0 , b1: 0,r.4  ;name
b2:  0 , b3: 0,r.9  ;tail
p. <:takestring:>
w.
i0:   rl  w1  0         ;   w1:=result;
      jl.    (j6.)      ;   end register expression

e1:                     ; entry changetail
     rl. w2 (j13.)  ;w2:=last used;
     ds. w3 (j30.)  ;saved stack ref , saved w3
     dl  w1  x2+8   ;get parameter name
     so  w0  16     ;if expr then
     jl. w3 (j4.)   ;take expression;
     ds. w3 (j30.)  ;saved stack ref , saved w3
     jl. w3  d1.    ;w3:=takestring1(name);
     dl  w1  x2+ 6  ;get parameter tail
     ba  w1  0      ;w1:=abs dope addr;
     rl  w1  x1     ;w1:=lower index-K (K=2);
     wa  w1 (x2+ 6) ;
     al  w1  x1+2   ;w1:=first addr;
     jd  1<11+44    ;change entry;
     jl.     i0.    ;end register expression

e2:                 ; entry head and tail
     rl. w2 (j13.)  ;w2:= stack ref
     ds. w3  (j30.) ;save stack ref, save w3
     dl w1 x2+8     ; take name param
     so w0 16       ;if expression then
     jl. w3 (j4.)   ;take expression
     ds. w3 (j30.)  ; save stack ref, save w3
     jl. w3  d1.    ;w3:=take string1(name);
     dl w1 x2+ 6    ;take param tail
     ba w1 0        ;w1:=abs dope addr
     rl w1 x1       ;w1:=lower index-k
     wa w1 (x2+ 6)  ;
     al w1  x1+2    ;w1:=first addr
     jd     1<11+76 ; lookup head and tail
     jl.    i0.     ; end regiater expression

e3:                 ; entry reserve segm

     rl. w2 (j13.)  ;w2:=stack segm
     ds. w3 (j30.)  ;save stack ref, save w3
     dl  w1 x2+12   ;take integer param segm
     so  w0 16      ;if expression then
     jl. w3 (j4.)   ;take expression
     ds. w3 (j30.)  ;save stack ref,save w3
     dl  w1 x1      ;w1w0:=value
     rl  w3 x2+10   ;w3:=first formal
     sz  w3 1       ;if real then
     cf  w1 0       ;conver to integer
     rs  w1 x2+10   ;save variable
     dl  w1 x2+8    ;take param name
     so  w0 16      ;if expressionthen
     jl. w3 (j4.)   ;take expression
     ds. w3 (j30.)  ;save stack ref,save w3
     jl. w3 d1.     ;w3:=take string1(name);
     rl  w0 x2+ 4   ;w0:=segm
     al. w1 b2.     ;w1:=tail addr
     rs  w0 x1+0    ;store segment
     al  w0 0       ;
     rs  w0 x1+2    ;
     rs  w0 x1+4    ;
     rs  w0 x1+6    ;
     rs  w0 x1+8    ;
     rs  w0 x1+10   ;
     rs  w0 x1+12   ;
     rs  w0 x1+14   ;
     rs  w0 x1+16   ;
     rs  w0 x1+18   ;
     jd  1<11+40    ;create entry
     jl.     i0.    ;end registerexpression

e4:                 ;entry wait
      rl. w2 (j13.) ;w2:=last used
      ds. w3 (j30.) ;saved stack ref,save w3
      dl  w1 x2+8   ;take integer param
      so  w0 16     ;if expression then
      jl. w3 (j4.)  ;goto RS take expression
      ds. w3 (j30.) ;save stack ref, save w3
      rl  w0 x1     ;w0:=sec
      rs. w0 b8.    ;store sec
      al. w1 b7.    ;w1:=message area
      al. w3 b9.    ;w3:=answer area
      jd  1<11+16   ;send message(<:clock:>);
      jd  1<11+18   ;wait answer
      jl.   (j8.)   ;end addres expression

e5:                 ;send answer
      rl. w2 (j13.) ;w2:=stack ref
      ds. w3 (j30.) ;save stack ref,save w3
      dl  w1 x2+12  ;take buffer-address param
      so  w0 16     ;if expression then
      jl. w3 (j4.)  ;take expression
      ds. w3 (j30.) ;save stack ref,save w3
      dl  w1 x2+8   ;take param result
      so  w0 16     ;if expression then
      jl. w3 (j4.)  ;take expression
      ds. w3 (j30.) ;save stack ref, save w3
      dl  w1 x2+16  ;take param answer
      ba  w1 0      ;w1:= abs dope addr
      rl  w1 x1     ;w1:=lower index-k
      wa  w1 (x2+16);
      al  w1 x1+2   ;w1:=first addr
      rl  w0 (x2+8) ;w0:=result
      rl  w2 (x2+12);w2:=buffer address
      jd  1<11+22   ;send answer
      jl.    (j8.)  ;end addres expression
e6:                 ;entry own descr
      rl. w2 (j13.)  ;w2:=last used
      ds. w3 (j30.)  ;save stack ref, save w3
      rl  w1  66     ;w1:=cur
      jl.    (j6.)   ;end register expression
w.
b7:   0,
b8:   0,r.7
b9:   <:clock:>,0,0,0
b13:13 0, b14: 0    ;work area item
b15:  2.11111       ;kind mark
f0:  <:<10>arr size:>
m.   end code of this segment
h.   0,r.(:10504-k:) w.
<:bsproc2    <0>:>
e.                  ;


;change_tail:
g0:    1           ;first tail:area with 1 segment
     0,0,0,0        ;fill
     1<23+e1-e20    ;tail point change entry
     3<18+25<12+41<6;integer procedure(undef,integer array)
     0              ;
     4<12+e0-e20    ;code proc, start of external
     1<12+00        ;1 code segment



;head_and_tail:
    1<23+4          ;modekind=backing store
    0,0,0,0         ;fill
    1<23+e2-e20     ;entry point head_and_tail
    3<18+25<12+41<6,0;integer procedure(string, integer array);
    4<12+e0-e20     ;code proc , start of external
    1<12+00         ;1 code segment
;reserve segm:
      1<23+4        ;modekind =backingstore
      0,0,0,0       ;fill
      1<23+e3-e20   ;entry point reserve segm
      3<18+13<12+41<6,0;integer procedure(string,integer array);
      4<12+e0-e20   ;code proc , star of externals
      1<12+00       ;1 code segment
;wait
      1<23+4        ;modekind = backing store
      0,0,0,0       ;fill
      1<23+e4-e20   ;entry point wait
      1<18+19<12,0  ;procedure wait(value integer);
      4<12+e0-e20   ;code proc , start af external
      1<12+00       ;1 code segment
;send answer:
      1<23+4        ;modekind=backingstore
      0,0,0,0       ;fill
      1<23+e5-e20   ;entry point send answer
      1<18+25<12+19<6+19,0;procedure(integer,integer,integer array);      
      4<12+e0-e20   ;code proc , satrt of externals
      1<12          ;1 code segm
;owndescr:
g1:  1<23+4         ;modekind = backingstore
     0,0,0,0        ;fill
     1<23+e6-e20    ;entry point owndescr
     3<18,0         ;integer procedure
     4<12+e0-e20    ;codeproc, start external
     4<12           ;1 code segment
n.
mode list.yes
comp=edit procnames
r/ /=compresslib /,l b,l-1,r/,//,f
i comp
scopepr=edit allnames
i/
global,
/,l b,l-1,r/,//,f
i scopepr
mode list.no
finisb
▶EOF◀