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

⟦e73b8b3d6⟧ TextFile

    Length: 26880 (0x6900)
    Types: TextFile
    Names: »scatuptx«

Derivation

└─⟦00964e8f7⟧ Bits:30007478 RC8000 Dump tape fra HCØ.
    └─⟦b2ec5d50f⟧ 
        └─⟦this⟧ »scatuptx« 
└─⟦621cfb9a2⟧ Bits:30002817 RC8000 Dump tape fra HCØ.  Detaljer om "HC8000" projekt.
    └─⟦0364f57e3⟧ 
        └─⟦baac87bee⟧ »gi« 
└─⟦667bb35d6⟧ Bits:30007480 RC8000 Dump tape fra HCØ.
    └─⟦4334b4c0b⟧ 
        └─⟦baac87bee⟧ »gi« 
            └─⟦this⟧ 

TextFile



;       susercat update       * page 1   18 07 80, 15.43;  

if listing.yes
char 10 12 10
scatup = set 1 disc1
scatup = algol connect.no       
begin

  comment the program handles the s_user_catalog <susercat>.
  the format of <susercat> is shown in s reference manual p.74.
  the following functions has been implemented:

  1. create a new <susercat>. An area <susercat> must be present
  _________
  syntax of call:
  _                                                 *
  scatup newcat.<catalog size in segm> !device name!
  _                                                 1

  2. insert an entry in <susercat>
  _________
  syntax of call:
  _                                                                *
  _                          !<dev. name>.<perm sli>.<perm ent>   !
  _                          !temp.<temp sli dev0>.<temp ent dev0>!
  _                          !prio.<integer>                      !
  _                          !comm.<integer>                      !
  _                          !buf.<integer>                       !
  _                          !area.<integer>                      !
  _                          !inter.<integer>                     !
  scatup insert.<entry name> !func.<integer>                      !
  _                          !std.<lower>.<upper>                 !
  _                          !max.<lower>.<upper>                 !
  _                          !user.<lower>.<upper>                !
  _                          !addr.<integer>                      !
  _                          !size.<integer>                      !
  _                          !prog.<prog>                         !
  _                                                                0

  a negative base must be represented as n.<integer>

  the default values are:
  <dev 0>.5.5
  buf.4  area.6
  std.8388605.8388605
  max.8388605.8388605
  user.8388605.8388605
  size.12800  prog.fp
  all others are set to zero

  3. delete an entry in <susercat>
  _________
  syntax of call:
  scatup delete.<entry name>

  4. list       an entry                 in <susercat>
  ___________   entry 0                   -     -
  ___________   all entries               -     -
  ___________   the device names and
  ___________   the names of all entries  -     -
  syntax of call:
  _                         1
  _           !cat         !
  scatup list.!<entry name>!
  _           !all         !
  _           !names       !
  _                         1
  ;  

\f



comment susercat update       * page 2   18 07 80, 15.43;  

  procedure error(no);  
______________________
  integer       no;  
  begin
    case no of
    begin
      <*1*>   write(out, "nl", 1, <:syntax:>);  
      <*2*>   write(out, "nl", 1,  param.ln_f, <:  entry unknown:>);  
      <*3*>   write(out, "nl", 1, param.ln_f, "sp", 2,  
      _           <:device not found in nametable:>);  
      <*4*>   write(out, "nl", 1, <:devicename expected after catsize:>);  
      <*5*>   write(out, "nl", 1, param.ln_f, <:   parameter error:>);  
      <*6*>   write(out, "nl", 1, param.ln_f, "sp", 2, <:action unknown:>);  
      <*7*>   write(out, "nl", 1, <:action missing:>);  
      <*8*>   write(out, "nl", 1, <:parameter missing:>);  
      <*9*>   write(out, "nl", 1, <:catalog full:>);  
      <*10*>  write(out, "nl", 1,  keyword.ln_f, 
      _           <:  unknown device name:>);  
      <*11*>  write(out, "nl", 1,  param.ln_f, <:  entry already exists:>);  
      <*12*>  write(out, "nl", 1, <:no output file allowed:>);  
      <*13*>  write(out, "nl", 1, <:too many parameters:>);  
    end;  
    write(out, "nl", 1, <:***scatup  no update performed:>);  
    goto stop;  
  end;  


  integer procedure hash(name, catsize);  
  ___________________________________
  comment compute hashvalue;  
  long array           name;  
  integer              catsize;  
  begin
    integer nv;  
    long name1;  
    name1 := name(1) + name(2);  
    nv := name1 extract 24 + name1 shift (-24);  
    if nv < 0 then nv := - nv;  
    hash :=  nv mod catsize;  
  end;  


  boolean procedure neg;  
  ______________________
  comment the procedure reads a parameter. If the parameter = n
  _       for negativ the procedure is true and it reads 
  _       the next parameter;  
  begin
    neg := false;  
    ip := readparam(param);  
    if ip <> 3 and ip <> 4 then error(1);  
    if ip = 4 then
    begin
      if long param(1) = long <:n:> then
      _          neg := true
      else error(5);  
      if readparam(param) <> 3 then error(5);  
    end;  
  end neg;  

\f



comment susercat update       * page 3   18 07 80, 15.43;  

  boolean procedure search(start_segm, end_segm, proc_name, func, upd);  
  ___________________________________________________________
  comment search segment;  
  comment func=1 means: find <proc_name> entry in s_catalog
  -   2   -  : find first unused entry starting at <hash_value>;  
  value            start_segm, end_segm;  
  integer                    start_segm, end_segm, func;  
  long array                proc_name;  
  boolean                             upd;  
  begin
    boolean found;  
    search := found := false;  
    setposition(s_cat, 0, start_segm);  
    for track := start_segm + 1 step 1 until end_segm do
    begin
      repeat
      begin
        if upd then rest := swoprec_6(s_cat, rec_lng)
        else rest := inrec_6(s_cat, rec_lng);  
        h_key := s_cat.h_key_f;  
        begin
          case func of
          begin
            <*1*> 
            begin
              if h_key <> -1 and h_key <> -2 and
              _        s_cat.name_f(1) = proc_name(1) and
              _      s_cat.name_f(2) = proc_name(2) then
              begin
                search := found := true;  
                track := end_segm + 1;  
              end;  
            end;  
            <*2*>
            begin
              if h_key = -1 or h_key = -2 then
              begin
                search := found := true;  
                track := end_segm + 1;  
              end;  
            end;  
          end;  
        end;  
      end;  
      until rest < rec_lng or found;  
    end;  
  end search;  

\f



comment susercat update       * page 4   18 07 80, 15.43;  

  procedure init;
  _______________
  comment inrec entry 0 and initialize;  
  begin
    inrec_6(s_cat, 4);  
    rec_lng    := s_cat.lng_f;  
    rest     := changerec_6(s_cat, rec_lng);  
    discs     := s_cat.lng_0// 6 - 2;  
    max_tracks := s_cat.segm_f;  
    ln_f     := 0;  
    for t := 1 step 2 until discs do
    begin
      rec_f      := rec_f + 12;  
      d_f         := d_f + 8;  
      disc.d_f(1)  := s_cat.rec_f.lg_f1;  
      disc.d_f(2)  := s_cat.rec_f.lg_f2;  
      sr(t)      := s_cat.rec_f.slice_f;  
      sr(t+1)     := s_cat.rec_f.ref_f;  
    end;  
  end init;  

\f



comment susercat update       * page 5   18 07 80, 15.43;  

  procedure newcat;
  _________________
  comment create new s_catalog;  
  begin
    integer j, ref;  

    ln_f := 0;  
    ref      := 44 - 8;  
    if readparam(param) = 3 then 
    max_tracks := param(1)   
    else error(1);  

    rest := outrec_6(s_cat, 512);  
    for l_f := 4 step 4 until 512  do
    s_cat.l_f := 0;  

    s_cat.segm_f := max_tracks;  
    t := 0;  
    for j := readparam(param) while j <> 0 do
    begin
      t := t + 1;  
      if j = 2 then
      begin
        integer i, bsno;  
        long array par(1:2);  
        par(1)  := long param(1);  
        par(2)   := long param(2);  
        bsno  := -1;  
        rec_f  := rec_f + 12;  
        ref    := ref + 8;  
        s_cat.rec_f.lg_f1 := long param(1);  
        s_cat.rec_f.lg_f2 := long param(2);  
        if -, claim_proc(3, bsno,  par, i, i, 
        _      s_cat.rec_f.slice_f) then error(3);  
        s_cat.rec_f.ref_f := ref;  
      end
      else error(4);  
    end;  
    rec_lng := s_cat.lng_f := 44 + 8 * t;  
    rec_0_lng := s_cat.lng_0 := 6 + 12 * t;  

    setposition(s_cat, 0, 0);  
    rest := swoprec_6(s_cat, rec_lng);  

    for track := 1 step 1 until max_tracks do
    begin
      repeat
      begin
        rest := swoprec_6(s_cat, rec_lng);  
        for l_f := 4 step 4 until rec_lng  do
        s_cat.l_f := 0;  
        s_cat.h_key_f := -1;  
      end;  
      until rest < rec_lng;  
    end;  
  end newcat;  

\f



comment susercat update       * page 6   18 07 80, 15.43;  

  procedure delete;
  _________________
  comment delete entry <proc_name> in s_catalog;  
  begin
    update := true;  
    init;  
    if readparam(param) = 4 then
    begin
      boolean found;  
      integer h;  
      h := hash(param.ln_f, s_cat.segm_f);  
      found := search(h, max_tracks, param.ln_f, 1, update);  
      if -, found then found := search(0, h, param.ln_f, 1, update);  
      if found then
      begin
        for l_f := 4 step 4 until rec_lng do
        s_cat.l_f := 0;  
        s_cat.h_key_f := -2;  
      end
      else  error(2);  
    end
    else error(5);  
    if readparam(param) <> 0 then error(13);  
  end delete;  

\f



comment susercat update       * page 7   18 07 80, 15.43;  

  procedure insert;
  _________________
  comment insert entry <proc_name> in s_catalog;  
  begin
    boolean found;  
    integer h;  
    integer field ent_pm_d0_f, segm_pm_d0_f;  
    update := true;  
    init;  
    if readparam(param) = 4 then
    begin
      h := hash(param.ln_f, s_cat.segm_f);  
      found := search(h, max_tracks, param.ln_f, 1, update);  
      if -, found then found := search(0, h, param.ln_f, 1, update);  
      if found then error(11);  
      found := search(h, max_tracks, param.ln_f, 2, update);  
      if -, found then found := search(0, h, param.ln_f, 2, update);  
      if found then 
      begin
        comment standard values in process entry;  
        _____________________________________
        for l_f := 4 step 4 until rec_lng do
        s_cat.l_f := 0;  

        s_cat.h_key_f     := h;  
        s_cat.name_f(1)   := long param(1);  
        s_cat.name_f(2)   := long param(2);  
        s_cat.buf_area_f  := 4 shift 12 + 6;  
        s_cat.max_lo      := 8388605;  
        s_cat.max_hi      := 8388605;  
        s_cat.std_lo      := 8388605;  
        s_cat.std_hi      := 8388605;  
        s_cat.size        := 12800;  
        s_cat.prog_f(1)   := long <:fp:>;  
        s_cat.usr_lo      := 8388605;  
        s_cat.usr_hi      := 8388605;  
        ent_pm_d0_f       := 50;  
        segm_pm_d0_f      := 52;  
        s_cat.ent_pm_d0_f  := 5;  
        s_cat.segm_pm_d0_f := 5 * sr(1);  
        comment  put in parameter values;  
        ________________________
        for j := readparam(keyword) while j <> 0 do  
        begin
          if j = 2 then
          action := longstring(tp,  string keyword(1), case tp of(
          <:prio:>, 
          <:comm:>, 
          <:buf:>, 
          <:area:>, 
          <:inter:>, 
          <:func:>, 
          <:max:>, 
          <:std:>, 
          <:size:>, 
          <:prog:>, 
          <:user:>, 
          <:temp:>,  
          <:addr:>,
          <::>))
          else error(1);  

\f



comment susercat update       * page 8   18 07 80, 15.43;  

          begin
            case action of
            begin

              <*_____1_____device name_____*>
              begin
                if readparam(param) = 3 then
                begin
                  di_f := 44 - 8;  
                  d_f := 4 - 8;  
                  found := false;  
                  for t := 1 step 2 until discs do
                  begin
                    di_f := di_f + 8;  
                    d_f := d_f + 8;  
                    if disc.d_f(1) = keyword.ln_f(1) and
                    _   disc.d_f(2) = keyword.ln_f(2) then
                    begin
                      found := true;  
                      s_cat.di_f(4) := param(1) * sr(t);  
                      if readparam(param) = 3 then
                      s_cat.di_f(3) := param(1)
                      else error(1);  
                    end;  
                  end;  
                  if -, found then error(10);  
                end
                else error(1);  
              end;  

              <*_____2_____prio_____*>
              begin
                if readparam(param) = 3 then
                begin
                  ip := param(1);  
                  s_cat.prio_com_f := ip shift 12;  
                end
                else error(5);  
              end;  

              <*_____3_____comm_____*>
              begin
                if readparam(param) = 3 then
                s_cat.prio_com_f := s_cat.prio_com_f + param(1)  
                else error(5);  
              end;  

              <*_____4_____buf_____*>
              begin
                if readparam(param) = 3 then
                begin
                  ip :=  param(1);  
                  s_cat.buf_area_f := ip shift 12
                  _     + s_cat.buf_area_f extract 12;  
                end
                else error(5);  
              end;  

\f



comment susercat update       * page 9   18 07 80, 15.43;  

              <*_____5_____area_____*>
              begin
                if readparam(param) = 3 then
                begin
                  ip :=  param(1);  
                  s_cat.buf_area_f := s_cat.buf_area_f shift (-12)
                  shift 12 + ip;  
                end
                else error(5);  
              end;  

              <*_____6_____inter_____*>
              begin
                if readparam(param) = 3 then
                begin
                  ip :=  param(1);  
                  s_cat.int_fnc_f := ip shift 12
                  + s_cat.int_fnc_f extract 12;  
                end
                else error(5);  
              end;  

              <*_____7_____func_____*>
              begin
                if readparam(param) = 3 then
                begin
                  ip :=  param(1);  
                  s_cat.int_fnc_f := s_cat.int_fnc_f shift (-12)
                  shift 12 + ip;  
                end
                else error(5);  
              end;  

              <*_____8_____max_____*>
              begin
                if neg then s_cat.max_lo := - param(1)
                else s_cat.max_lo := param(1);  
                if neg then s_cat.max_hi := - param(1)
                else s_cat.max_hi := param(1);  
              end;  

              <*_____9_____std_____*>
              begin
                if neg then s_cat.std_lo := - param(1)
                else s_cat.std_lo := param(1);  
                if neg then s_cat.std_hi := - param(1)
                else s_cat.std_hi := param(1);  
              end;  

              <*____10_____size_____*>
              begin
                if readparam(param) = 3 then
                s_cat.size  := param(1)  
                else error(5);  
              end;  

\f



comment susercat update       * page 10   18 07 80, 15.43;  

              <*____11_____prog_____*>
              begin
                if readparam(param) = 4 then
                begin
                  s_cat.prog_f(1) := param.ln_f(1);  
                  s_cat.prog_f(2) := param.ln_f(2);  
                end  
                else error(1)
              end;  

              <*____12_____user_____*>
              begin
                if neg then s_cat.usr_lo := - param(1)
                else s_cat.usr_lo := param(1);  
                if neg then s_cat.usr_hi := - param(1)
                else s_cat.usr_hi := param(1);  
              end;  

              <*____13_____temp dev. 0_____*>
              begin
                if readparam(param) = 3 then
                begin
                  di_f := 44;  
                  s_cat.di_f(2) := param(1) * sr(1);  
                  if readparam(param) = 3 then s_cat.di_f(1) := param(1)
                  else error(5);  
                end  
                else error(5);  
              end;  

              <*____14_____addr_____*>
              begin
                if readparam(param) = 3 then
                s_cat.addr_f := param(1)
                else error(5)
              end;  

            end case action;  
          end;  
        end while;  
      end
      else error(9);  
    end
    else error(5);  
  end insert;  

\f



comment susercat update       * page 11   18 07 80, 15.43;  

  procedure pr_cat(out_z);
  ________________________
  comment output from entry 0 ;  
  zone       out_z;  
  begin
    comment output of cat reservation;  
    ch := ch + write(out_z, 
 "nl", 3, <:susercat = set 21 disc d.0 0 0 11.0 0:>, 
 "nl", 1, <:scope user    susercat:>);  

    comment output of gen cat entry;  

    ch := ch + write(out_z, "nl", 2, <:scatup newcat:>, <<-ddddddd>, 
    _    <:.:>, s_cat.segm_f, <:,:>, "sp", 4,  
    _    <:catsize:>, "nl", 1);  

    d_f := 4 - 8;  
    for t := 1 step 2 until discs do
    begin
      d_f         := d_f + 8;  
      ch := ch + write(out_z, <:,:>, "nl", 1, true, 12, disc.d_f);  
    end;  
    ch := ch + write(out_z, "nl", 2);  
  end pr_cat;  

\f



comment susercat update       * page 12   18 07 80, 15.43;  

   procedure pr_proc(out_z);
  _________________________________
  comment output from process entry;  
  zone         out_z;  
  begin

    integer procedure write_base(basel, baseu, text);  
    _________________________________________
    value                 basel, baseu;  
    integer               basel, baseu;  
    string                             text;  
    write_base := 
    write(out_z, "nl", 1, text, <<ddddddd>,  
    _     if basel < 0 then <:n.:> else <:  :>, 
    _     if basel >= 0 then basel else 
    _      - basel, <:.:> , if baseu < 0 then <:n.:> else <:  :>, 
    _     if baseu >= 0 then baseu else
    _      - baseu, <:,:>);  

    integer procedure write_disc(disc_a, disc_name);  
    ________________________________________________
    integer array                disc_a;  
    long    array                        disc_name;  
    begin
      integer s;  
      s := write(out_z, <:,:>, "nl", 1, true, 12, disc_name, <:.:>);  
      s := s + write(out_z, <<dddddd>, disc_a(4)//sr(t), <:.:>);  
      s := s + write(out_z, <<dddddd>, disc_a(3));  
      write_disc := s;  
    end write_disc;  

    begin
      integer s;
      s := write(out_z, "nl", 1, <:scatup_insert.:>,   
      _     s_cat.name_f, <:,:>);  
      ch := ch + s;
      if all then ch := ch + write(out_z,"nl",1,<:,:>,"*",s - 2);
      ch := ch + write(out_z, "nl", 1, <:prio.:>, s_cat.prio_com_f shift (-12),  
      _ "sp", 1, <:comm.:>, s_cat.prio_com_f extract 12, <:,:>);  
      ch := ch + write(out_z, "nl", 1, <:buf.:>, s_cat.buf_area_f shift (-12),  
      _ "sp", 1, <:area.:>, s_cat.buf_area_f extract 12, <:,:>);  
      ch := ch + write(out_z, "nl", 1, <:inter.:>, s_cat.int_fnc_f shift (-12),  
      _ "sp", 1, <:func.:>, s_cat.int_fnc_f extract 12, <:,:>);  
      ch := ch + write_base(s_cat.std_lo, s_cat.std_hi, <:std .:>);  
      ch := ch + write_base(s_cat.usr_lo, s_cat.usr_hi, <:user.:>);  
      ch := ch + write_base(s_cat.max_lo, s_cat.max_hi, <:max .:>);  
      ch := ch + write(out_z, "nl", 1, <:addr.:>, s_cat.addr_f);  
      ch := ch + write(out_z, "sp", 1, <:size.:>, <<ddddddd>, s_cat.size, 
      _ "sp",1,<:prog.:>,s_cat.prog_f,<:,:>);
      ch := ch + write(out_z,"nl",1,<:,resource____slices___entr,:>);

      di_f := 44 - 8;  
      d_f := 4 - 8;  
      for t := 1 step 2 until discs do
      begin
        di_f   := di_f + 8;  
        d_f    := d_f + 8;  
        if t = 1 then ch := ch + write(out_z, "nl", 1, true, 12, <:temp:>,  
        _     <:.:>, <<dddddd>, s_cat.di_f(2)//sr(1), 
        _     <:.:>, s_cat.di_f(1));  
        ch := ch + write_disc(s_cat.di_f, disc.d_f);  
      end;  
    end;  

    ch := ch + write(out_z, "nl", 3);  
  end pr_proc;  

\f



comment susercat update       * page 13   18 07 80, 15.43;  

  procedure list(out_z);
  _____________________
  comment subprogram list;  
  zone         out_z;  
  begin
    init;  
    ch := 0; <*character counter*>
    update := false;  
    all := false;
    if readparam(param) = 4 then
    begin
      action := longstring(tp,  string param(1), case tp of (
      <:cat:>, 
      <:all:>, 
      <:names:>,  
      <::>));

      case action of
      begin

        <*1_____list process_____ *>
        begin
          boolean found;  
          integer  h;  
          h := hash(param.ln_f, s_cat.segm_f);  
          found := search(h, max_tracks, param.ln_f, 1, update);  
          if -, found then found := search(0, h, param.ln_f, 1, update);  
          if found then               
          begin
            ch := ch + write(out_z, "nl", 1, <:scatup delete.:>, s_cat.name_f); 
            pr_proc(out_z);
          end
          else error(2);  
        end;  

        <*2_____list entry 0_____ *>
        pr_cat(out_z);  

        <*3_____list all_____ *>
        begin
       all := true;
          pr_cat(out_z);  
          ip := 1;  
          for track := 1 step 1 until max_tracks do
          begin
            repeat
            begin
              rest := inrec_6(s_cat, rec_lng);  
              begin 
                h_key := s_cat.h_key_f;  
                if h_key <> -1 and h_key <> -2 then   
               begin
                  if ip mod 3 = 0 then ch := ch + write(out_z, "ff",1);
                  pr_proc(out_z);  
                  ip := ip + 1;  
                end;  
              end;  
            end;  
            until rest < rec_lng;  
          end;  
          ch := ch + write(out_z, <:scatup list.names:>);  
        end;  

\f



comment susercat update       * page 14   18 07 80, 15.43;  

        <*4_____list process names_____ *>
        begin
          ch := ch + write(out_z, "ff", 1, "nl", 2, <:,device names in susercat:>);  
          d_f  := 4 - 8;  
          for t := 1 step 2 until discs do
          begin
            d_f  := d_f + 8;  
            ch := ch + write(out_z, "nl", 1, <:,:>, disc.d_f);  
          end;  

          ch := ch + write(out_z, "nl", 1, <:,process names in susercat :>);  
          for track := 1 step 1 until max_tracks do
          begin
            repeat
            begin
              rest := inrec_6(s_cat, rec_lng);  
              begin 
                h_key := s_cat.h_key_f;  
                if h_key <> -1 and h_key <> -2 then
                _   ch := ch + write(out_z, "nl", 1, <:,:>, s_cat.name_f);  
              end;  
            end;  
            until rest < rec_lng;  
          end;  
        end;  

      end;  
    end  
    else error(8);  
    if readparam(param) <> 0 then error(13);  
  end list;  

\f



comment susercat update       * page 15   18 07 80, 15.43;  

  procedure split(out_z);
  ________________________
  comment split    find subprogram;  
  zone     out_z;  
  begin

    comment initialize gen cat entry;  
    ___________________________________
    open(s_cat, 4, <:susercat:>, 0);  
    lng_f   := 4;  
    lng_0   := 6;  
    segm_f  := 8;  
    lg_f1   := 4;  
    lg_f2   := 8;  
    slice_f := 10;  
    ref_f   := 12;  
    rec_f   := 8 - 12;  
    d_f     := 4 - 8;  

    comment initialize track process entries;  
    _______________________________________
    h_key_f     := 2;  
    prio_com_f  := 4;  
    name_f      := 4;  
    buf_area_f  := 18;  
    int_fnc_f   := 20;  
    pr_pk_f     := 22;  
    max_lo      := 24;  
    max_hi      := 26;  
    std_lo      := 28;  
    std_hi      := 30;  
    size        := 32;  
    prog_f      := 32;  
    usr_lo      := 42;  
    usr_hi      := 44;  
    addr_f      := 14;  

    action := longstring(tp, string param(1), case tp of(
    <:newca:> add 116, 
    <:delet:> add 101, 
    <:inser:> add 116, 
    <:list:>,  
    <::>));
    case action of
    begin
      error(6);  
      newcat;  
      delete;  
      insert;  
      list(out_z);  
    end;  
    close(s_cat, true);  
  end split;  

\f



comment susercat update       * page 16   18 07 80, 15.43;  

  comment main prog;  
  ________________
  zone                  s_cat(128, 1, std_error);  

  integer               rec_lng, discs, t, rec_0_lng, pos, max_pos, 
  _                     max_tracks, track, h_key, rest;  

  integer       field   lng_f, lng_0, segm_f, slice_f, ref_f, size, 
  _                     h_key_f, prio_com_f, buf_area_f, int_fnc_f, pr_pk_f, 
  _                     max_lo, max_hi, std_lo, std_hi, usr_lo, usr_hi, addr_f;  
  long          field   lg_f1, lg_f2, l_f;  

  long    array         disc (1:20),  scope(1:2);  

  integer array         sr(1:20), tail(1:10);  

  integer array field   di_f;  

  long    array field   d_f, rec_f, name_f, prog_f, ln_f;  

  integer i, j, action, tp, ip,ch;  
  array param(1:2), keyword(1:2), outfile(1:2);  
  zone  out_z(128, 1, stderror);  
  boolean update,all;  

  j := read_param(param);  
  if j <> -1 then
  begin
    if j = 2 then split(out) else error(7)
  end
  else
  begin
    outfile(1) := param(1); outfile(2) := param(2);
    scope(1) := scope(2) := 0;  
    ln_f := 0;  
    i := lookup_proc(scope, outfile.ln_f, tail);  
    if (scope(1) = long <:syste:> add 109 <*m*> and scope(2) = 0)
    or  scope(1) = long <:***:> then i := 3;  

    if i <> 0 then
    begin
      for i := 1 step 1 until 10 do tail(i) := 0;  
      ln_f := 2;  
      tail(1) := 1; <*size*>  
      tail.ln_f(1) := long <:disc:>;  
      tail(6) := shortclock;  
      ln_f := 0;  
      i := setproc(outfile.ln_f, tail);  
    end create new entry;  
    if i = 0 then
    begin
      open(out_z, 4, outfile, 0);  
      if readparam(param) = 2 then
      begin
        if long param(1) = long <:list:> then split(out_z)
        else error(12);  
      end
      else error(7);  
      ch := ch + write(out_z, "nl", 1, <:end:>, "nl", 1, em, 3);  
      close(out_z, true);  
      tail(1) := ch // 768;
      if ch mod 768 <> 0 then tail(1) := tail(1) + 1;
       chngentrpr(outfile.ln_f,tail);
    end
    else
    system(9)alarm:(i, <:<10>settroubl:>);  
  end;  
  stop:  <*stop*>
end

if ok.no
mode warning.yes

if warning.yes
(mode 0.yes
message s_cat_up not ok
lookup s_cat_up)

if 0.no
(scope user   s_cat_up
lookup s_cat_up susercat)

end

finis
▶EOF◀