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

⟦5176e3d18⟧ TextFile

    Length: 37632 (0x9300)
    Types: TextFile
    Names: »tdescribe«

Derivation

└─⟦667bb35d6⟧ Bits:30007480 RC8000 Dump tape fra HCØ.
    └─⟦4334b4c0b⟧ 
        └─⟦162d2eb5b⟧ »talgprog« 
            └─⟦this⟧ 

TextFile

(mode list.yes
head cpu
describe=set 25
describe=algol connect.no blocks.yes
scope user describe
head cpu
mode list.no)
1980-11-05
begin
integer i,j,k,nt,ntstart,ntper,ntarea,ntint,ntend,pda,na,
        dev,fdevice,ldevice,fint,lint,farea,larea,
       fbuf,lbuf,bufsize,bufadr,lowerl,upperl,
       int,octal,halfword,byte,bit,text,s_int,all,l_base,u_base,
       kind_a,name_a,pda_a,res_a,user_a,first_slice_a,seg_a,
       doc_a,wa_a,ra_a,main_a,n_mess_a,p_mess_a,i_addr_a,
       userhw,userhw1,proc_kind,proc_size,upl,lwl,externalsize,
       internals,internalsize,areas,areasize,
       userwords,fdrum,fdisc,topchain,drumchain,
       discchain,proc_base,id_mask,ppda,dev_no;
boolean halfw,found,nl,sp,rpda,spda,reserver,user,
  parent,any,table;
integer array desc(1:1),chain1,chain2(1:2);
boolean array opt,opt1(1:10);
long array field n,name,lo;
array field r,raf;
integer field kind,lowerb,upperb;
array inp,cid(1:3);

procedure writetime(l);
value l;
long l;
begin
real r,r1;
r:=l/10000;
write(out,<< dd dd dd>,systime(4,r,r1),r1);
end;

procedure writelong(l);
value l; long l;
begin
write(out,<<    dddddddddddddd>,l/10000);
end;

procedure getlimit(ll,ul,max);
value max; integer ll,ul,max;
begin
integer i;
ll:=1; ul:=max;
if readifpnext(fpnr,i) and i>=ll and i<=max then
begin
  ul:=i;
  if readifpnext(fpnr,i) and i>=ul and i<=max then
  begin
    ll:=ul;
    ul:=i
  end;
end;
if false then write(out,nl,1,"*",1,<:limits :>,ll,ul);
end getlimit;

boolean procedure test_user(desc,id_mask);
value id_mask; integer id_mask;
integer array desc;
testuser:=integerand(desc(proc_base+user_a+id_mask shift (-13) extract 12)
          shift (-((id_mask shift (-12) extract 12+1) 
          mod 2)*12) extract 12,
          id_mask extract 12)<>0;

integer procedure find_ext_size(nt);
value nt; integer nt;
begin
integer pda,pda1;
  pda:=wordload(nt);
  pda1:=0;
  for nt:=nt+2 while nt<ntarea and pda>pda1 do pda1:=wordload(nt);
  find_ext_size:=pda1-pda;
end find_ext_size;

\f

procedure get_descr_or_name(name,addr,descr);
value                                 descr ;
boolean                               descr ;
integer                          addr       ;
array                       name            ;
begin
integer array iarr(1:1),table(1:1);
integer i,j,no_of_procs;
boolean found;
real array field raf;
found:= false;
raf:= 0;
no_of_procs:=(ntend-ntstart)//2;
redefarray(table,ntstart,no_of_procs*2);
for i:= 1,i+1 while i <= no_of_procs and -,found do
begin
  redefarray(iarr,2+table(i),12);
  found:= if -,descr
             then addr = table(i)  
             else name(1) = iarr.raf(1) and
                  name(2) = iarr.raf(2);
  if found then
  begin
    if descr then addr:= table(i)
    else
    begin
      name(1):= iarr.raf(1);
      name(2):= iarr.raf(2);
    end;
  end;
end;
if -,found then write(out,nl,1,"*",2,name.lo,<: not found: (getdesc) :>);
end get_descr_or_name;
\f

  procedure check_procfunc(name);
  array                    name ;
  begin
    if name(1) = real<:procf:> add 117 and
       name(2) = real<:nc:>
    then
    begin
      name(1):= name(1) shift (-24);
      name(2):= real<:cfunc:>;
    end;
  end;
\f

procedure type_names(mask,rel_a);
integer mask,rel_a ;
begin
integer i,j,k;
integer array table,iarr(1:1);
real array field raf;
integer array field id;
  
  raf:= 6; id:= 16;
  redefarray(table,ntint,internals*2);
  for i:= 1,i+1 while i <= internals do
  begin
    redefarray(iarr,table(i)-4,internalsize);
    for k:= 0 step 1 until 11 do
    if mask shift (-k) extract 1 = 1   and
     iarr.id(1) shift (-k) extract 1 = 1 and
     (if rel_a=-1 then mask=iarr.id(1) else
     iarr.id(1) shift (-12)  = rel_a)      then
     begin <* id-mask of internal is contained in 'mask' *>
       if iarr.raf(1) = real<:pro:> shift (-24) <* i. e. procfunc *> then
       begin
         write(out,sp,2,<:procfunc:>);
       end else
       begin
         j:= 1;
         write(out,sp,2,string iarr.raf(increase(j)));
       end;
       if rel_a=-1 then k:=12;
     end;
    end;
end type_names;
\f

  
  integer procedure identification_mask(name);
  array                                 name ;
  begin
    integer i,j;
    integer array table,iarr(1:1);
    boolean found;
    real array field raf;
  
    raf:= 6; found:= false;
    check_procfunc(name);
    redefarray(table,ntint,internals*2);
    for i:= 1,i+1 while i <= internals do
    begin
      redefarray(iarr,table(i)-4,internalsize);
      if name(1) = iarr.raf(1) and
         name(2) = iarr.raf(2) then
         begin
           found:= true;
           identification_mask:= iarr(9);
         end;
    end;
    if -,found then write(out,nl,1,"*",2,name.lo,<: not found(idmask):>);
  end identification_mask;
\f

procedure type_table(lowerl,upperl);
value lowerl,upperl; integer lowerl,upperl;
begin
integer base,i,j,k;
integer array table(1:1);
long field timef;

redefarray(table,66,54);
timef:=110-66+2;
write(out,nl,1,<:core.:>,<<ddddd>,66);
for i:=lowerl step 1 until upperl do
begin
if i<>22 then
write(out,nl,1,<<ddd>,64+2*i,<:::>,case i of (
    <:current process     :  :>,
    <:next    process     :  :>,
    <:prev    process     :  :>,
    <:name table start    :  :>,
    <:first device nt     :  :>,
    <:first area   nt     :  :>,
    <:first int    nt     :  :>,
    <:name table end      :  :>,
    <:next     buffer     :  :>,
    <:previous buffer     :  :>,
    <:first buffer pool   :  :>,
    <:last  buffer pool   :  :>,
    <:buffer size         :  :>,
    <:first drum chain    :  :>,
    <:first disc chain    :  :>,
    <:top chain           :  :>,
    <:chain table main cat:  :>,
    <:not used            :  :>,
    <:max time slice      :  :>,
    <:time slice          :  :>,
    <:not used            :  :>,
    <::>,
    <:time                :  :>,
    <:clock value sensed  :  :>,
    <:not used            :  :>,
    <:storage halfwords   :  :>,
    <:global,aux permkey  :  :>));
   if i<>22 and i<>23  then
   writeformatted(table(i),if i>=27 then halfword else int) else
   if i<>22 then writetime(table.timef);
end for;
end type_table;

procedure type_external(pda,desc,lowerl,upperl);
value pda,lowerl,upperl;
integer pda,lowerl,upperl;
integer array desc;
if desc(proc_base+kind_a)=0 or desc(proc_base+kind_a)=4 or
   desc(proc_base+kind_a)=64 then 
   begin
   long array field raf;
   raf:=6+userhw;
   write(out,nl,1,"*",2,
   desc.raf,<: not external kind :>,desc(procbase+kinda));
   end else
if lowerl>=1 and upperl>=lowerl and upperl<400 then
begin
integer i,j,wr,k,nt;
real array field raf;
array name(1:2);
raf:= 6+userhw; j:= i:= 1;
nt:=ntstart-2;
repeat nt:=nt+2 until wordload(nt)=pda and nt<ntend;
externalsize:=find_ext_size(nt);
k:=externalsize//2;
if upperl>k then upperl:=k;
write(out,nl,1,<:core.:>,<<ddddd>,pda-4,nl,1);
k:=if upperl>13 then 13 else upperl;
for wr:=lowerl step 1 until k do
begin
case wr of
begin
          write(out,<<dddddddd>,<:lower interval      : :>,sp,2,
            desc(procbase+l_base),nl,1);
  write(out,<<dddddddd>,<:upper interval      : :>,sp,2,
            desc(procbase+u_base),nl,1);
  write(out,<<dddddddd>,<:kind                : :>,sp,2,
            desc(procbase+kind_a),nl,1);
  write(out,<:name                : :>,sp,2,
             string desc.raf(increase(i)),nl,1);;;;
  begin
  write(out,<<dddddddd>,<:main                : :>,sp,2,
            desc(procbase+main_a));
  get_descr_or_name(name,desc(proc_base+main_a),false);
  write(out,sp,3,name.lo,nl,1);
  end;
  begin
   write(out,<<dddddddd>,<:reserver            : :>,sp,2);
   write_formatted(desc(procbase+res_a),bit);
   type_names(desc(procbase+res_a),-1);
   end reserver;
   begin <*users*>
     write(out,nl,1,
          <:users               : :>,sp,2);
     for j:=0 step 1 until userhw1 do
     begin
       if j extract 1 = 0 then
       begin
         if j>0 then write(out,nl,1,sp,24);
         write_formatted(desc(procbase+user_a+(j shift (-1))),bit);
       end;
     type_names(desc(procbase+user_a+j//2) shift (-((j+1) mod 2)*12) extract 12,j);
     end;
     end;
     write(out,nl,1,<<-ddddddddd>,<:next message        : :>,sp,2,
        desc(procbase+n_mess_a),nl,1);
     write(out,<<-ddddddddd>,<:previous message    : :>,sp,2,
        desc(procbase+p_mess_a),nl,1);
     write(out,<<-ddddddddd>,<:interrupt address   : :>,sp,2,
        desc(procbase+i_addr_a),nl,1);
  end case;
end for wr;
for wr:=if lowerl>13 then lowerl else 14 step 1 until upperl do
begin
  write_formatted(desc(procbase+wr-3),all-text);
  write(out,nl,1);
end;
outendcur(0);
end type_external else
write(out,nl,1,"*",2,<:external lower, upper:>,lowerl,upperl);

\f

procedure type_area_process(pda,desc,lowerl,upperl);
value pda,lowerl,upperl;
integer pda,lowerl,upperl;
integer array desc;
if -,(desc(proc_base+kind_a)=4 or desc(proc_base+kind_a)=64) then
write(out,nl,1,"*",2,cid.lo,<: not area or pseudo :>) else
begin
integer i,j,k,wr;
array name(1:2);
real array field raf;
if upperl>areasize//2 then upperl:=areasize//2;
if desc(proc_base+kind_a)=64 then
begin
  if upperl>9 then upperl:=9;
end;
raf:= 6+userhw; i:= j:= 1;
write(out,nl,1,<:core.:>,<<-dddddd>,pda,nl,1);
for wr:=lowerl step 1 until upperl do
begin
   case wr of
       begin
        write(out,<<-ddddddddd>,<:lower interval     : :>,sp,2,
          desc(proc_base+l_base),nl,1);
        write(out,<<-ddddddddd>,<:upper interval     : :>,sp,2,
          desc(proc_base+u_base),nl,1);
        write(out,<<-ddddddddd>,<:kind               : :>,sp,2,
          desc(proc_base+kind_a),nl,1); 
        write(out,<<-ddddddddd>,<:name               : :>,sp,2,
          string desc.raf(increase(i)),nl,1);;;;
        begin
        write(out,<<-ddddddddd>,<:proc descr addr    : :>,sp,2,
          desc(proc_base+pda_a));
        if abs desc(proc_base+pda_a)>0 then
        begin
          get_descr_or_name(name,abs (desc(proc_base+pda_a)//2*2),false);
          j:=1;
          write(out,sp,3,string name(increase(j)));
       end;
       write(out,nl,1);
     end pda;
        begin 
        write(out,<<-ddddddddd>,<:reserver           : :>,sp,2);
        write_formatted(desc(proc_base+res_a),bit);
        type_names(desc(proc_base+res_a),-1);
        end;
        begin 
        write(out,nl,1,
                <:users              : :>,sp,2);
      for j:=0 step 1 until userhw1 do
      begin
        if j extract 1=0 then
        begin
          if j>0 then write(out,nl,1,sp,23);
          write_formatted(desc(proc_base+user_a+(j shift (-1))),bit);
        end;
        type_names(desc(proc_base+user_a+j//2) shift (-((j+1) mod 2)*12) extract 12,j);
      end;
      write(out,nl,1);
      end user;
        write(out,<<-ddddddddd>,<:first slice        : :>,sp,2,
            desc(proc_base+first_slice_a),nl,1);
        write(out,<<-ddddddddd>,<:no of segments     : :>,sp,2,
            desc(proc_base+seg_a),nl,1);
        begin <*doc*>
        write(out,<:document           : :>,sp,2);
        j:= 1; raf:= 24+userhw;
        write(out,string desc.raf(increase(j)),nl,1);
        end doc;;;;
        write(out,<<-ddddddddd>,<:write counter      : :>,sp,2,
           desc(proc_base+wa_a),nl,1);
        write(out,<<-ddddddddd>,<:read  counter      : :>,sp,2,
          desc(proc_base+ra_a),nl,1);
        end case;
     end loop;
      outendcur(0);
    end type_area_process;


\f

procedure type_chain(pda,desc,lowerl,upperl);
value pda,lowerl,upperl;
integer pda,lowerl,upperl;
integer array desc;
begin <* prints chainhead *>
integer i,j,k,wr;
real array field raf1,raf2;
j:= i:= k:= 1;
raf1:= 8; raf2:= 18;
write(out,nl,1,<:core.:>,<<-dddddd>,pda-36,nl,1);
if upperl>19 then upperl:=19;
for wr:=lowerl step 1 until upperl do
begin
  case wr of
  begin
    write(out,<<-ddddddddd>,<:rel. addr. of claims in i. p.   : :>,sp,2,
           desc(1),nl,1);
    write(out,<<-ddddddddd>,<:first slice in auxcat           : :>,sp,2,
                desc(2) shift (-12) extract 12,nl,1);
    write(out,<<-ddddddddd>,<:bs kind                         : :>,sp,2,
    if desc(2) shift (-3) extract 1 = 1 then<:disc:> else
               <:drum:>,nl,1);
    write(out,<<-ddddddddd>,<:permkey                         : :>,sp,2,
                desc(2) extract 3,nl,1);
    write(out,<:name of auxcat                  : :>,sp,2,
              string desc.raf1(increase(j)),nl,1);;;;
    write(out,<<-ddddddddd>,<:size of auxcat                  : :>,sp,2,
           desc(9),nl,1);
    write(out,<:document name                   : :>,sp,2,
                string desc.raf2(increase(k)),nl,1);;;;
   write(out,<:slice length                     : :>,sp,2,
             desc(15),nl,1);
    write(out,<:last slice of document          : :>,sp,2,
          <<-ddddddddd>,desc(16) shift (-12) extract 12,nl,1,
              <:first slice of chaintable area  : :>,sp,2,
          desc(16) extract 12,nl,1);
    begin
      write(out,<:state of document             : :>,sp,2);
      for i:=0 step 1 until 6 do
        if desc(17) shift (-(12+i)) extract 1=1 then
        write(out,case i+1 of (<:idle:>,<:after prepare:>,<:during insert:>,
                  <:ready:>,<:during delete:>,<:during aux:>));
    end state; <*work*>;
    write(out,nl,1,<:start of chaintable at address  : :>,sp,2,
         <<-ddddddddd>,pda,<:  slicelink       :>,<<ddddd>,
         desc(19) shift (-12) extract  12,desc(19) extract 12,nl,1);
       end case;
    end for wr;
    outendcur(0);
    end type_chain;



\f

procedure type_buf(bufadr,desc,lowerl,upperl);
value bufadr,lowerl,upperl;
integer bufadr,lowerl,upperl;
integer array desc;
begin
integer i,j,k,wr;
real array name(1:2);
j:= 1;
write(out,nl,1,<:core.:>,<<-dddddd>,bufadr,nl,1);
k:=if upperl>=5 then 5 else upperl;
for wr:=lowerl step 1 until k do
     begin
     case wr of
     begin
        write(out,<<-dddddd>,<:message flag      : :>,desc(1),nl,1);
        write(out,<<-dddddd>,<:next buffer       : :>,desc(2),nl,1);
        write(out,<<-dddddd>,<:prev buffer       : :>,desc(3),nl,1);
        begin
        write(out,<<-dddddd>,<:receiver/result   : :>,desc(4));
       if abs(desc(4)) > 7 <* receiver addr *> then
       begin
        get_descr_or_name(name,abs(desc(4)//2*2),false);
        j:= 1;
        write(out,sp,3,string name(increase(j)));
      end;
      outchar(out,10);
      end receiver;
      begin <*sender*>
      write(out,<:sender            : :>,<<-dddddd>,desc(5));
      if abs(desc(5)) > 0 then
      begin
        get_descr_or_name(name,abs(desc(5)),false);
        j:= 1;
        write(out,sp,3,string name(increase(j)));
      end;
      outchar(out,10);
      end sender;
     end case;
    end for wr;
    k:=if lowerl<=6 then 6 else lowerl;
      for i:= k step 1 until upperl do
      begin
        write_formatted(desc(i),all);
        outcharcur(10);
      end;
    outendcur(0);
    end type_buf;

\f

procedure type_int_struct(pda,desc,opt);
value pda; integer pda;
integer array desc;
boolean array opt;
begin
integer lwl,upl,i,j;
typeinternal(pda,desc,1,7,true);
for j:=1 step 1 until 4 do
begin
  lwl:=if opt(j) then (case j of (29,37,43,64)) else 1;
  upl:=if opt(j) then (case j of (35,42,50,internalsize//2)) else 0;
  if opt(j) then type_internal(pda,desc,lwl,upl,false);
  opt(j):=false;
end j;
end type_int_struct;
\f

procedure type_internal(pda,desc,lowerl,upperl,first);
value pda,lowerl,upperl,first;
integer pda,lowerl,upperl;
boolean first;
integer array desc;
if desc(3)<>0 then write(out,nl,1,"*",cid.lo,<: not internal:>) else
if lowerl>=1 and lowerl<=upperl and upperl<=200 then
begin
integer i,j,first_bs_claims,last_bs_claims,words;
array name(1:2);
long field lf;
long array field namef;
      found:= true;
      first_bs_claims:=if halfw then 60 else 56;
      last_bs_claims:=first_bs_claims+(if halfw then 3 else 7);
      j:= 1;
      if first then write(out,nl,1,<:start of internal process : :>,
                <:core:>,<:.:>,<<ddddd>,pda,nl,1);
     words:=internalsize//2;
     if upperl>words then upperl:=words;
         words:=if lowerl<64 then (case lowerl of(
            1,1,3,4,4,4,4,8,9,10,10,12,12,14,14,16,17,18,19,20,
            21,21,23,23,25,25,27,28,29,30,
            30,32,32,34,34,36,37,37,39,39,
            41,41,43,44,45,46,47,48,48,48,
            51,51,53,53,55,56,57,57,57,57,
            57,62,62)) else
            lowerl-lowerl mod 8;
         i:=if lowerl<64 then (
            case lowerl of (1,1,2,3,3,3,3,4,5,6,6,7,7,8,8,9,10,
            11,12,13,14,14,15,15,16,16,17,18,19,20,20,21,21,22,
            22,23,24,24,25,25,26,26,27,28,29,30,31,32,32,33,33,
            34,34,35,36,37,37,37,37,37,38,38)) else
            39+(lowerl-64)//8;
      while words<=upperl do
      begin
        words:=words+1;
        if i<39 then write(out,case i of
                 (<:interval lim :  :>,
                 <:kind         :  :>,
                 <:name         :  :>,
                 <:scount,state :  :>,
                 <:ident        :  :>,
                 <:event q head :  :>,
                 <:proc  q elem :  :>,
                 <:first,top    :  :>,
                 <:buf,area     :  :>,
                 <:int,func     :  :>,
                 <:prio         :  :>,
                 <:mode(pk,pr)  :  :>,
                 <:interrupt m  :  :>,
                 <:excep,escape :  :>,
                 <:init cpa,base:  :>,
                 <:init wr lim  :  :>,
                 <:init interr l:  :>,
                 <:parent descr :  :>,
                 <:quantum      :  :>,
                 <:run time     :  :>,
                 <:start run    :  :>,
                 <:start wait   :  :>,
                 <:wait addr    :  :>,
                 <:cat base     :  :>,
                 <:max base     :  :>,
                 <:std base     :  :>,
                 <:w0 : :>,
                 <:w1 : :>,
                 <:w2 : :>,
                 <:w3 : :>,
                 <:status       :  :>,
                 <:ic,cause,sb  :  :>,
                 <:curr cpa,base:  :>,
                 <:curr wr lim  :  :>,
                 <:curr interr l:  :>,
                 <:save area    :  :>,
                 <:g20-g24      :  :>,
                 <:b18,b19      :  :>)) else
      write(out,<:bs claims:>,<<dd>,i-39,<:  :  :>);


        if i>38 then
        begin
          first_bs_claims:=first_bs_claims +(if halfw then 4 else 8);
          last_bs_claims:= last_bs_claims  +(if halfw then 4 else 8);
          words:=words+7;
        end;
  
        case i of
        begin
          
          begin <* interval limits *>
            write_formatted(desc(1),int);
            write_formatted(desc(2),int);
            words:=words+1;
          end;
  
          <* kind *>
            write_formatted(desc(3),int);
  
          <* name *>
            begin
            namef:=6;
            write(out,sp,2,desc.namef);
            words:=words+3;
            end;
  
          <* stop count,state *>
            write_formatted(desc(8),halfword + bit);
  
          <* identification *>
            write_for_matted(desc(9),bit);
  
          begin <* next,last event *>
            write_formatted(desc(10),int);
            write_formatted(desc(11),int);
            words:=words+1;
          end;
  
          begin <* next,last process *>
            write_formatted(desc(12),int);
            write_formatted(desc(13),int);
            words:=words+1;
          end;
  
          begin <* first,top address *>
            write_formatted(desc(14),int);
            write_formatted(desc(15),int);
            words:=words+1;
          end;
  
          <* buf,area *>
            write_formatted(desc(16),halfword);
  
          <* internal claim,function mask *>
            write_formatted(desc(17),halfword+bit);
  
          <* priority *>
            write_formatted(desc(18),int);
  
          <* mode (pk,pr) *>
            write_formatted(desc(19),halfword);
  
          <* interrupt mask *>
            write_formatted(desc(20),bit);
  
          begin <* exception,escape address *>
            write_formatted(desc(21),int);
            write_formatted(desc(22),int);
            words:=words+1;
          end;
      
          begin <* initial cpa,base *>
            write_formatted(desc(23),int);
            write_formatted(desc(24),int);
            words:=words+1;
          end;
  
          begin <* initial write limits *>
            write_formatted(desc(25),int);
            write_formatted(desc(26),int);
            words:=words+1;
          end;
  
          <* interrupt levels *>
            write_formatted(desc(27),halfword);
  
          <* parent description *>
          begin
            write_formatted(desc(28),int);
            get_descr_or_name(name,desc(28),false);
            namef:=0;
            write(out,sp,3,name.namef);
          end;
  
          <* quantum *>
            write_formatted(desc(29),int);
  
  
          begin <* run time *>
            <*write_formatted(desc(30),int);
            write_formatted(desc(31),int);*>
            lf:=62;
            writelong(desc.lf);
            words:=words+1;
          end;
  
          begin <* start run *>
            <*write_formatted(desc(32),int);
            write_formatted(desc(33),int);*>
            lf:=66;
            writetime(desc.lf);
            words:=words+1;
          end;
  
          begin <* start wait *>
            <*write_formatted(desc(34),int);
            write_formatted(desc(35),int);*>
            lf:=70;
            writetime(desc.lf);
            words:=words+1;
          end;
  
          <* wait address *>
            write_formatted(desc(36),int);
  
          begin <* catalog base *>
            write_formatted(desc(37),int);
            write_formatted(desc(38),int);
            words:=words+1;
          end;
  
          begin <* max base *>
            write_formatted(desc(39),int);
            write_formatted(desc(40),int);
            words:=words+1;
          end;
  
          begin <* std base *>
            write_formatted(desc(41),int);
            write_formatted(desc(42),int);
            words:=words+1;
          end;
  
          <* w0 *>
            write_formatted(desc(43),all-text);
  
          <* w1 *>
            write_formatted(desc(44),all-text);
  
          <* w2 *>
            write_formatted(desc(45),all-text);
 
          <* w3 *>
            write_formatted(desc(46),all-text);
  
          <* status *>
            write_formatted(desc(47),bit);
  
          begin <* ic,cause,sb *>
            write_formatted(desc(48),int);
            write_formatted(desc(49),int);
            write_formatted(desc(50),int);
            words:=words+2;
          end;
  
          begin <* current cpa,base *>
            write_formatted(desc(51),int);
            write_formatted(desc(52),int);
            words:=words+1;
          end;
  
          begin <* current write limits *>
            write_formatted(desc(53),int);
            write_formatted(desc(54),int);
            words:=words+1;
          end;
 
          <* current interrupt levels *>
            write_formatted(desc(55),halfword);
  
          <* save area *>
            write_formatted(desc(56),int);
    
          <* g20-g24 *>
            begin
            for j:= 57 step 1 until 61 do
            write_formatted(desc(j),int);
            words:=words+4;
            end;
  
          begin <* b18,b19 *>
            write_formatted(desc(62),int);
            write_formatted(desc(63),int);
            words:=words+1;
          end;
  
          <* bs claims 0 *>
            for j:= first_bs_claims step 1 until last_bs_claims do
            write_formatted(desc(j),if halfw then halfword else s_int);
  
          <* bs claims 1 *>
            for j:= first_bs_claims step 1 until last_bs_claims do
            write_formatted(desc(j),if halfw then halfword else s_int);
  
          <* bs claims 2 *>
            for j:= first_bs_claims step 1 until last_bs_claims do
            write_formatted(desc(j),if halfw then halfword else s_int);

          <* bs claims 3 *>
            for j:=first_bs_claims step 1 until last_bs_claims do
            write_formatted(desc(j),if halfw then halfword else s_int);
          <* bs claims 4 *>
            for j:=first_bs_claims step 1 until last_bs_claims do
            write_formatted(desc(j),if halfw then halfword else s_int);
          <* bs claims 5 *>
            for j:=first_bs_claims step 1 until last_bs_claims do
            write_formatted(desc(j),if halfw then halfword else s_int);

          <* bs claims 6 *>
            for j:=first_bs_claims step 1 until last_bs_claims do
            write_formatted(desc(j),if halfw then halfword else s_int);
          <* bs claims 7 *>

            for j:=first_bs_claims step 1 until last_bs_claims do
            write_formatted(desc(j),if halfw then halfword else s_int);

          <* bs claims 8 *>
            for j:=first_bs_claims step 1 until last_bs_claims do
            write_formatted(desc(j),if halfw then halfword else s_int);
        end case;
      write(out,nl,1);
      i:=i+1;
  
      end while;
    outendcur(0);
end type_internal else
if lowerl<>1 and upperl<>0 then
write(out,nl,1,"*",2,<:internal lower,upper:>,lowerl,upperl);


\f

procedure write_formatted(word,mask);
value                     word,mask ;
integer                   word,mask ;

begin <* writes the contents of 'word' according format specification
           given in 'mask'                                                *>
integer i,j,char;
for i:= 0 step 1 until 6 do
    begin
      if mask shift (-i) extract 1 = 1 then
      begin
        case i+1 of
        begin
  
          write(out,<<-ddddddd>,word,"!",1); <* integer *>
  
          begin <* octal *>
            for j:= 21 step -3 until 0 do
            write(out,<<d>,word shift(-j) extract 3);
            write(out,"!",1);
          end;
  
          write(out,<<dddd>,word shift (-12) extract 12,sp,1,word extract 12,
                    "!",1);  <* halfword *>
  
          write(out,<<ddd>,word shift (-16) extract 8,sp,1,word shift (-8) extract 8,
                    sp,1,word extract 8,"!",1); <* byte *>
  
          begin <* bit *>
            for j:= 0 step 1 until 23 do
            write(out,if word shift j < 0 then <:1:> else <:.:>);
            write(out,"!",1);
          end;
          
          begin <* text *>
            for j:= 16 step -8 until 0 do
            begin
              char:= word shift (-j) extract 8;
              if char > 32 and char < 127 
                 then outchar(out,char)
                 else outchar(out,32);
            end;
          write(out,"!",1);
          end;
          write(out,<<ddddd>,word,"!",1);  <* short integer *>
  
        end case;
      end;
    end for-loop;
  end write_formatted;
\f

integer procedure format(param);
array param;
format:= if param(1) = real<:integ:> add 101  and
            param(2) = real<:r:>              then 1 else
         if param(1) = real<:octal:>          then 2 else
         if param(1) = real<:halfw:> add 111  and
            param(2) = real<:rd:>             then 3 else
         if param(1) = real<:byte:>           then 4 else
         if param(1) = real<:bit:>           then 5 else
         if param(1) = real<:text:>            then 6 else
         if param(1) = real<:all:>            then 7 else 8;


<*main program                                  *>
lo:=r:=0;
lowerb:=2; upperb:=4; kind:=6;
name:=6;
ntstart:=wordload(72);
ntper:=wordload(74);
ntarea:=wordload(76);
ntint:=wordload(78);
ntend:=wordload(80);
fbuf:=wordload(86);
lbuf:=wordload(88);
bufsize:=wordload(90);
fdrum:=wordload(92);
fdisc:=wordload(94);
topchain:=wordload(96);
drumchain:=fdrum-36;
discchain:=fdisc-36;
int:=             1;
octal:=   1 shift 1;
halfword:=1 shift 2;
byte:=    1 shift 3;
bit :=    1 shift 4;
text:=    1 shift 5;
s_int:=   1 shift 6;
all:=           127;
l_base:=         -2;
u_base:=         -1;
kind_a:=          0;
name_a:=          1;
pda_a:=           5;
res_a:=           6;
user_a:=         -3;
first_slice_a:=   8;
seg_a:=           9;
doc_a :=          5;
wa_a:=           14;
ra_a:=           15;
main_a:=          5;
n_mess_a:=        8;
p_mess_a:=        9;
i_addr_a:=       10;

sp:= false add 32;
nl:= false add 10;
comment include number of discs and drums;
redefarray(chain1,drumchain,4);
redefarray(chain2,discchain,4);
halfw:=chain1(2) extract 3 +1 = (chain2(1) - chain1(1))//2;
internals:=(ntend-ntint)//2;
internalsize:=wordload(ntint+2)-wordload(ntint);
areas:=(ntint-ntarea)//2;
areasize:=wordload(ntarea+2)-wordload(ntarea);
userwords:=(internals+23)//24;
userhw:=userwords*2;
userhw1:=userhw-1;
proc_base:=3+userwords;
user_a:=-proc_base+1;
connectlso;
readinfp(inp,1);
table:=inp(1)=real <:table:>;
if readifp(<:table:>,lowerl,1) then
begin
  table:=true;
  fpnr:=fpnr-1;
end;
if table then
begin
  getlimit(lowerl,upperl,27);
  type_table(lowerl,upperl);
end;
if readsfp(<:buf:>,cid,<::>) then
begin
<*buffer*>
  if cid(1)=real <:all:> or cid(1)=real <:used:> then
  begin
    getlimit(lowerl,upperl,13);
    for bufadr:=fbuf step bufsize until lbuf do
    begin
     redefarray(desc,bufadr-2,26);
     if cid(1)=real <:all:> or desc(4)<>0 then
       typebuf(bufadr,desc,lowerl,upperl);
    end;
  end all or used
  else
  begin
   pda:=description(cid);
   if pda=0 then write(out,nl,1,"*",2,cid.lo,<: not found:(buf):>)
   else
   begin
    inp(1):=real <::>;
    rpda:=readsfpnext(fpnr,inp) and inp(1) shift (-40) extract 8='r';
    if -,rpda then fpnr:=fpnr-1;
    spda:=inp(1)shift(-40) extract 8 = 's';
    if spda then fpnr:=fpnr+1;
    if readsfpnext(fpnr,inp) then
    begin
     rpda:=rpda or inp(1) shift (-40) extract 8='r';
     spda:=spda or inp(1) shift (-40) extract 8='s';
   end else fpnr:=fpnr-1;
  end;
  if -,rpda and -,spda then spda:=rpda:=true;
  getlimit(lowerl,upperl,13);
  for bufadr:=fbuf step bufsize until lbuf do
  begin
   redefarray(desc,bufadr-2,26);
   if (spda and desc(5)=pda) or (rpda and desc(4)=pda) then
      typebuf(bufadr,desc,lowerl,upperl);
 end buf.<name>;
end buf;
  end for buf;
if readsfp(<:area:>,cid,<::>) then
begin
<*area*>
  if cid(1)=real <:all:> or cid(1)=real <:used:> then
  begin
    getlimit(lowerl,upperl,areasize//2-userwords);
    for nt:=ntarea step 2 until ntint-2 do
    begin
     pda:=wordload(nt);
     redefarray(desc,pda+2-2*procbase,areasize);
     if cid(1)=real <:all:> or desc(proc_base+pda_a)<>0 then
       type_area_process(pda,desc,lowerl,upperl);
    end;
  end all or used
  else
  begin
   pda:=if cid(1)=real <:procf:> add 'u' and
        cid(2)=real <:nc:> then wordload(ntint) else
        description(cid);
   if pda=0 then write(out,nl,1,"*",2,cid.lo,<: not found(area):>)
   else
   begin
    inp(1):=real <::>;
    reserver:=readsfpnext(fpnr,inp) and inp(1)shift (-40) extract 8='r';
    if -,reserver then fpnr:=fpnr-1;
    user:=inp(1)shift(-40) extract 8='u';
    if user then fpnr:=fpnr+1;
    if readsfpnext(fpnr,inp) then
    begin
     reserver:=reserver or inp(1)shift (-40) extract 8='r';
     user:=user or inp(1)shift (-40) extract 8='u';
   end else fpnr:=fpnr-1;
  end;
  getlimit(lowerl,upperl,areasize//2-userwords);
  if reserver or user then
  begin
  id_mask:=identification_mask(cid);
  for nt:=ntarea step 2 until ntint-2 do
  begin
   pda:=wordload(nt);
   redefarray(desc,pda+2-2*procbase,areasize);
   if (reserver and desc(procbase+res_a)=id_mask) or
      (user and testuser(desc,id_mask)) then
      type_area_process(pda,desc,lowerl,upperl);
   end for nt;
   end reserver or user
   else
   begin
     redefarray(desc,pda+2-2*procbase,areasize);
     if desc(proc_base+kind_a)=4 or desc(proc_base+kind_a)=64 then
     type_area_process(pda,desc,lowerl,upperl);
   end;
 end area.<name>;
end area;
if readsfp(<:int:>,cid,<::>) then
begin
<*internal*>
  if cid(1)=real <:all:> or cid(1)=real <:used:> then
  begin
    getlimit(lowerl,upperl,internalsize//2);
    for nt:=ntint step 2 until ntend-2 do
    begin
     pda:=wordload(nt);
     redefarray(desc,pda-4,internalsize);
     if cid(1)=real <:all:> or desc(2)<>0 or nt=ntint then
       type_internal(pda,desc,lowerl,upperl,true);
    end;
  end all or used
  else
  begin
   pda:=if cid(1)=real <:procf:> add 'u' and
        cid(2)=real <:nc:> then wordload(ntint) else 
        description(cid);
   if pda=0 then write(out,nl,1,"*",2,cid.lo,<: not found(internal):>)
   else
   begin
    for i:=1 step 1 until 10 do opt(i):=false;
    inp(1):=real <::>;
 parent:=false;
  while readsfpnext(fpnr,inp) do
  begin
   for j:=1 step 1 until 4 do
   begin
    if inp(1)= real (case j of (<:times:>,<:bases:>,
       <:regis:> add 't',<:claim:> add 's')) then
      opt(j):=true;
   end;
   if inp(1)=real <:p:> then
   begin
     ppda:=pda;
     parent:=ppda>0;
  end .p.;
  end while;
  j:=0;
  any:=false;
  repeat j:=j+1;
    any:=any or opt(j);
  until any or j=10;
  fpnr:=fpnr-1;
  getlimit(lowerl,upperl,internalsize//2);
  redefarray(desc,pda-4,internalsize);
  if parent then
  begin
   for nt:=ntint step 2 until ntend-2 do
   begin
     pda:=wordload(nt);
     redefarray(desc,pda-4,internalsize);
     if desc(28)=ppda and any then 
     begin
       for j:=1 step 1 until 10 do opt1(j):=opt(j);
       type_intstruct(pda,desc,opt1);
     end else
     if desc(28)=ppda then type_internal(pda,desc,lowerl,upperl,true);
   end for nt;
  end parent else
  if -,any then type_internal(pda,desc,lowerl,upperl,true) else
  begin
   type_int_struct(pda,desc,opt);
  end any;
  end pda>0;
 end internal.<name>;
end internal;
if readsfp(<:proc:>,cid,<::>) then
begin
<*process*>
  if cid(1)=real <:all:> or cid(1)=real <:used:> then
  begin
    getlimit(lowerl,upperl,200);
    for nt:=ntstart step 2 until ntend-2 do
    begin
     pda:=wordload(nt);
     redefarray(desc,pda-4,internalsize);
     if cid(1)=real <:all:> or desc(4)<>0 then
     begin
       proc_kind:=desc(3);
       if proc_kind=0 then typeinternal(pda,desc,lowerl,
         if upperl*2>internal_size then internalsize//2 else
            upperl,true) else
       begin
         redefarray(desc,pda+2-2*procbase,400);
         if proc_kind=4 or proc_kind=64 then
            type_area_process(pda,desc,lowerl,upperl) else
         begin
           upl:=find_ext_size(nt)//2;
           type_external(pda,desc,lowerl,upl);
         end ext;
       end;
     end;
    end;
  end all or used
  else
  begin
   pda:=if cid(1)=real <:procf:> add 'u' and cid(2)=real <:nc:> then
        wordload(ntint) else description(cid);
   if pda=0 then write(out,nl,1,"*",2,cid.lo,<: not found:(ext):>)
   else
   begin
   getlimit(lowerl,upperl,200);
   redefarray(desc,pda-4,400);
   proc_kind:=desc(3);
   if proc_kind=0 then typeinternal(pda,desc,lowerl,upperl,true) else
   begin
     redefarray(desc,pda+2-2*procbase,400);
     if proc_kind=4 or proc_kind=64 then typeareaprocess(pda,desc,lowerl,
         upperl) else
      begin
       typeexternal(pda,desc,lowerl,upperl);
     end;
   end proc_kind<>0;
 end proc.<name>;
end proc;
end for proc;
if readsfp(<:chain:>,cid,<::>) then
begin
<*chain*>
  raf:=18;
  getlimit(lowerl,upperl,19);
  for nt:=fdrum step 2 until topchain-2 do
    begin
     pda:=wordload(nt);
     redefarray(desc,pda-36,38);
     if cid(1)=real <:all:> or (cid(1)=real <:used:> and desc(9)<>0) or
       (cid(1)=desc.raf(1) and cid(2)=desc.raf(2)) then
       type_chain(pda,desc,lowerl,upperl);
    end;
end chain;
if readsfp(<:ext:>,cid,<::>) then
begin
<*external*>
  if cid(1)=real <:all:> or cid(1)=real <:used:> then
  begin
    getlimit(lowerl,upperl,400);
    for nt:=ntstart step 2 until ntint-2 do
    begin
     pda:=wordload(nt);
     externalsize:=find_ext_size(nt);
     redefarray(desc,pda+2-2*procbase,externalsize);
     upl:=externalsize//2;
     if upl>upperl then upl:=upperl;
     if cid(1)=real <:all:> or desc(proc_base+name_a)<>0  then
       type_external(pda,desc,lowerl,upl);
    end;
  end all or used
  else
  begin
   pda:=if cid(1)=real<:procf:>add'u' and cid(2)=real <:nc:> then
        wordload(ntint) else description(cid);
   if pda=0 then write(out,nl,1,"*",2,cid.lo,<: not found(external):>)
   else
   begin
  inp(1):=real<::>;
  user:=reserver:=false;
  if -,readsfpnext(fpnr,inp) then fpnr:=fpnr-1 else
  begin
   user:=inp(1)shift (-40) extract 8='u';
   reserver:=inp(1)shift (-40) extract 8='r';
  end;
  getlimit(lowerl,upperl,200);
  if reserver or user then
  begin
    id_mask:=identificationmask(cid);
    if false then write(out,nl,1,"*",1,<:ntstart,ntarea,ntint:>,
        ntstart,ntarea,ntint);
    for nt:=ntstart step 2 until ntarea-2 do
    begin
      pda:=wordload(nt);
      redefarray(desc,pda+2-2*procbase,400);
      if (reserver and desc(proc_base+res_a)=id_mask) or
         (user and testuser(desc,id_mask)) then
      typeexternal(pda,desc,lowerl,upperl);
    end for nt
  end user or reserver else
  begin
  redefarray(desc,pda+2-2*procbase,400);
  type_external(pda,desc,lowerl,upperl);
  end;
  end pda>0;
 end external.<name>;
end external;
if readifp(<:ext:>,devno,0) then
begin
  nt:=ntper+2*devno;
  pda:=wordload(nt);
  raf:=2*procbase;
  redefarray(desc,pda+2-2*procbase,400);
  getlimit(lowerl,upperl,200);
  if desc(procbase+namea)<>0 then typeexternal(pda,desc,lowerl,upperl)
     else write(out,nl,1,desc.raf.lo,<: not found (devnr):>);
  end devnr;
  if fpout then closeout;
end;
▶EOF◀