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

⟦8ac0dbe6d⟧ TextFile

    Length: 43008 (0xa800)
    Types: TextFile
    Names: »slicel3tx   «

Derivation

└─⟦01e83a425⟧ Bits:30008166 Bånd med SW8010 og SW8500 source code
    └─⟦75ff9bef3⟧ 
        └─⟦this⟧ »slicel3tx   « 

TextFile

 
  
  
\f

 <*
   
   
    
   
     
    
   
 
 
 
                  UTILITY PROGRAM SLICELIST.
                  __________________________
    
        
  
                  Author:  Hans Henriksen.
  
                  Release: June 1979.
 *>
\f


 begin
     
    <* 790614.            SLICELIST rel. 1.0               page  1 *>
  
  
    <*           Table of contents.
                 __________________
                                                  page
        1. Introduction...........................  2
        2. Declarations...........................  3
        2.1 Variables.............................  3
        2.2 Procedures............................  5
        2.2.1 connectout..........................  5
        2.2.2 errormessage........................  6
        2.2.3 fpparam.............................  7
        2.2.4 termout............................. 10
        2.2.5 testoutput.......................... 11
        2.2.6 writeentry.......................... 13
        2.2.7 writeslices......................... 14
        3. Initialization......................... 19
        4. The central loop....................... 20
        5. Program termination.................... 24
    *>
\f


    <* 841009.            SLICELIST rel. 1.0               page  2 *>
  
    <*  1. Introduction.
        ________________
 
        This is the sourcetext for the utilityprogram SLICELIST.
  
        The program is described in RCSL. no 31-D570.
   
        Below is given a summery of the syntax for the program call,
     and a debugging facility is shortly described.
  
      Call:
      _____
  
                    1                       *             *
        (<outfile>=) slicelist ((<modifier>) <filename> )
                    0
  
        <filename>::=<name of a file stored on an RC82xx/RC83xx disc>
  
                     (cylinder )
                     (segment  )  (yes)
        <modifier>::=(         ) .(   )
                     (slice    )  (no )
                     (test     )
  
        <outfile>::=<name of desired output file>
  
     The initial setting of the modifiers are:
        cylinder.no, segment.no, slice.yes, and test.no .
  
        If test.yes is specified in the program call, it will cause
     an execution of procedure Testoutput (see page 11) for each fol-
     lowing occurrence of <filename>.
    *>
\f


    <* 790614.            SLICELIST rel. 1.0               page  3 *>
 
 
    <*
     2. Declarations.
     ________________
  
     2.1 Variables.
     ______________
    *>
     
     integer i,j,                   <* index                        *>
                                    <*                              *>
             number_of_heads,       <* the number of heads on the   *>
                                    <* disc on which the file beeing*>
                                    <* processed is stored.         *>
                                    <*                              *>
             slicelength,           <* the slicelength for the logi-*>
                                    <* cal disc on which the file be*>
                                    <* ing processed is stored.     *>
                                    <*                              *>
             type;                  <* the value of type determines *>
                                    <* what action that is to be per*>
                                    <* formed in the central loop   *>
      
     boolean alternate_outfile,     <* true if an <outfile> is spe- *>
                                    <* cified in the program call   *>
                                    <* otherwise false              *>
                                    <*                              *>
             cylinder,              <* corresponds  to the          *>
             segment,               <* <modifier>'s in the program  *>
             slice,                 <* call.                        *>
             test,                  <*                              *>
             finis,                 <* holds the exit condition for *>
                                    <* the central loop.            *>
             ff, nl, sp, ok;        <*                              *>
  
     array   chaintable(1:512),     <* holds the chaintable for the *>
                                    <* logical disc on which the    *>
                                    <* file being processed is sto- *>
                                    <* red.                         *>
                                    <*                              *>
             parameter(1:5,1:2),    <* holds the text equivalents   *>
                                    <* for the <modifier>'s             *>
                                    <*                              *>
             items(1:4),            <* parameters in calls of the   *>
             progname(1:2),         <* procedures connectout,fpparam*>
             stack(1:2);            <* and termout.                 *>
  
     integer
     array   fdpd(1:6),             <* physical disc process descrip*>
                                    <* tion                         *>
             entry(1:20),           <* holds the catalog entry for  *>
                                    <* the file being processed     *>
             ib(1:20),              <* parameters in procedure calls*>
             itemtype(1:2),         <*                              *>
             kind(1:1),             <* process kind                 *>
             ldpd(1:4),             <* logical disc process descrip-*>
                                    <* tion.                        *>
             pda1, pda2(1:1);       <* process description address  *>
   
\f


    <* 790614.            SLICELIST rel. 1.0               page  4 *>
 
  
     integer
     array
     field   iaf;
  
     boolean
     array
     field   baf;
  
     real    yes, no;               <*holds the texts 'yes' and 'no'*>
 
 
     zone z(1,1,stderror);          <* used in calls of procedure   *>
                                    <* monitor.                     *>
\f

    <* 790614.            SLICELIST rel. 1.0               page  5 *>
  
    <* 2.2 Procedures.
       _______________
 
       2.2.1 connectout.
    *>
 
    boolean procedure connectout(filename,stack);
 
    array filename, stack;
  
    <*  This procedure terminates the use of the file to which the
     zone OUT is currently connected, in a way so that it may be later 
     resumed, and connects the zone OUT to the file specified by the
     parameter 'filename'. If no file with that name exists or it cannot
     be connected, then a file with the specified name is created (on
     the main-disc) if the necessary resources are available.
  
        Call:
  
            connectout(filename, stack)
 
            connectout      (return value, boolean)  true if the file 
                            specified by filename is connected otherwise
                            false.
    
            filename        (call value, array) length >= 2, filename(1)
                            and filename(2) is expected to contain the name
                            of the file, to which the zone OUT is to be con
                            nected.
  
            stack           (return value, array) length >= 2, contains the
                            name of the BS-area on which the previous con
                            tent of the zone OUT is dumped.
   
     The procedure uses the external procedure FPPROC(action,w0,w1,w2),
     descibed in RCSL. no 31-D356, which simulates the execution of:
        jl w3 fpbase + h-name(action).
     
     The actual used 'actions' connect output (h28), stack zone (h29),
     and unstack zone (h30) are described in System 3 utility programs,
     part three RCSL no 31-D379 page 8-4 ff.
    *>
    begin
       integer size;
       array name, temp(1:2);
 
       temp(1) := temp(2) := real <::>;
       name(1) := filename(1);
       name(2) := filename(2);
       fpproc(29,0,out,temp);         <* stack zone                      *>
       size := 3;                     <* size := no. of segm. add device *>
       fpproc(28,size,out,name);      <* connect zone                    *>
  
       if size <> 0
       then
       begin                          <* file can not be connected   *>
          fpproc(30,0,out,temp);      <* unstack zone                *>
          connectout := false;
       end
       else
       begin
          connectout := true;         <* file is connected           *>
          stack(1) := temp(1);        <* save stack area name        *>
          stack(2) := temp(2);
       end;
    end *** procedure connectout ***;
\f

    <* 841009.            SLICELIST rel. 1.0               page  6 *>
 
    <* 2.2.2 errormessage.
    *>
   
    procedure errormessage(no);
    value no; integer no;
    
    <*    This procedure outputs a message on current output. The message
       has the following form:
  
          *** slicelist <text>
  
       where the <text> part of the message depends on the value of no. The
       correspondence between <text> and the value of no are shown in the 
       table listed below:
   
          no              <text>
           1   <name> can not be connected.
           2   <name> can not be looked up.
           3   <name> is not a BS-area.
           4   <name> , <devicename> intervention.
           5   <name> , <devicename> is not an rc82xx/rc83xx disc.
           6   param: <name>.<name> illegal.
 
         The procedure references the following global declared
       variables: entry, items, nl, sp.
    *>
  
    begin
       integer k, l;
       real array field raf;
  
       k := 1;
       write(out,nl,2,<:*** slicelist:>,sp,3);
 
       case no of
       begin
  
          write(out,string items(increase(k)),sp,2,
                <:can not be connected:>,nl,1);
  
          write(out,string items(increase(k)),sp,2,
                <:can not be looked up.:>,nl,1);
  
          write(out,string items(increase(k)),sp,2,
                <:is not a BS-area.:>,nl,1);
 
          begin raf := 0; l := 5;
             write(out,string items(increase(k)),<: , :>,
                   string entry.raf(increase(l)),
                   <:  intervention.:>,nl,1);
          end;
  
          begin  l := 3;
             write(out,<:param: :>,string items(increase(k)),
                  <:.:>,string items(increase(l)),sp,2,
                  <:illegal.:>,nl,1);
          end;
  
          begin raf := 0; l := 5;
             write(out,string items(increase(k)),<: , :>,
                   string entry.raf(increase(l)),
                   <: is not an rc82xx/rc83xx disc.:>);
          end;
        end *** case no of ***;
 
    end *** procedure errormessage ***;
\f

    <* 790614.            SLICELIST rel. 1.0               page  7 *>
 
    <* 2.2.3 fpparam.
    *>
   
    integer procedure fpparam(maxintno,maxnameno,maxitemno,progname,items,
                              itemtype);
 
    value                     maxintno,maxnameno,maxitemno;
 
    integer                   maxintno,maxnameno,maxitemno;
 
    array                     progname,items;
 
    integer array             itemtype;
    
    <*
       This procedure reads the next <param> from the FP-commandstack, and 
    returns the items which were part of it.As a special case <name>=<name> 
    is considered to be a single <param>. A formal definition of <param> is 
    given below:
 
       <param>::=<name>=<name> I <itemlist> I <empty>
       <itemlist>::=<item> I <item>.<itemlist>
       <item>::=<integer> I <name>
       <empty>::= end of commandstack
       
       In case of an error (see below), the procedure outputs a message on 
    current output, and skips forward until the first <item> of the next 
    <param>. The only situation which can give rise to the errorreaction 
    are when one or more of the three following relations are not 
    fulfilled:
 
       number of integer items in param <= maxintno
       number of name items in param <= maxnameno
       number of items in param <= maxitemno
       
    e.i. the <param> consists of more <item>'s than it is allowed
    
    Errormessage format: *** progname param: <param> illegal
    
    Call:    fpparam(maxintno,maxnameno,maxitemno,progname,items,itemtype)
 
             fpparam     (return value, integer) in case of an error -1 
                         else number of items.
    
             maxintno    (call value,integer ) states the maximum number of 
                         integer items which are allowed in the <param>.
    
             maxnameno   (call value, integer) states the maximum number of 
                         name items which are allowed in the <param>.
    
             maxitemno   (call value, integer) states the maximum number of 
                         items which are allowed in the <param>.
    
             progname    (call value, array) used in case of an error as 
                         part of the errormessage.
    
             items       (return value, array) contains the items which 
                         were part of the just read <param>. Integer items 
                         occupies one location, name items occupies two 
                         locations.
    
             itemtype    (return value, integer array) gives the informa-
                         tion neessary for interpretation of the contents 
                         of items. Itemtype(i) is equal to one if the i'th 
                         item was a name and is equal to two if the i'th 
                         item was an integer.
    *>
\f

    <* 790614.            SLICELIST rel. 1.0               page  8 *>
    
    begin
 
 
       procedure error;
   
       begin
 
          integer i, j, n; integer array digit(1:8);
 
          no := oldno; i := 1;
          write(out,<:<10>*** :>,string progname(increase(i)),<: param: :>);
 
          sep_and_type := system(4,no,name);
 
          repeat
 
             if sep_and_type extract 12//4 = 1
             then
             begin
                i := 0; n := name(1);
                repeat
                   i := i + 1;
                   digit(i) := n - n//10 * 10 + 48;
                   n := n//10;
                until n = 0;
                for j := i step -1 until 1 do outchar(out,digit(j));
             end
             else
             begin
                i := 1;
                write(out,string name(increase(i)));
             end;
  
             no := no + 1;
             sep_and_type := system(4,no,name);
  
             if (6 shift 12 add sep_and_type) shift (-12) < 12
             then finis := true
             else write(out,<:.:>);
 
          until finis;
          
          write(out,<: illegal:>);
 
          itemno := -1;
  
       end *** procedure error ***;
 
 
  
       own integer no; 
 
       integer intno, nameno, itemno, oldno, sep_and_type;
  
       array name(1:2);
  
       boolean finis;
\f

    <* 790614.            SLICELIST rel. 1.0               page  9 *>
 
       intno := nameno := itemno := 0;
       oldno := no;
       finis := false;
  
       sep_and_type := system(4,no,name);
 
       repeat
  
          case sep_and_type extract 12//4 + 1 of
          begin
   
             <* end of commandlist *>
 
             finis := true;      

  
             <* integer item       *>
 
             if intno = maxintno or itemno = maxitemno
             then error
             else
             begin
                intno := intno + 1;
                itemno := itemno + 1;
                itemtype(itemno) := 2;
                items(nameno * 2 + intno) := name(1);
             end;
 
 
             <* name item          *>
  
             if nameno = maxnameno or itemno = maxitemno 
             then error
             else
             begin
                itemno := itemno + 1;
                itemtype(itemno) := 1;
                items(nameno * 2 + intno + 1) := name(1);
                items(nameno * 2 + intno + 2) := name(2);
                nameno := nameno + 1;
             end;
 
          end *** case sep_and_type extract 12//4 + 1 of ***;
 
 
          if -, finis
          then
          begin
             no := no + 1;
             sep_and_type := system(4,no,name);
             finis := (6 shift 12 add sep_and_type) shift (-12) < 12;
          end;
  
       until finis;
 
       fpparam := itemno;
 
    end *** procedure fpparam ***;
\f

    <* 790614.            SLICELIST rel. 1.0               page 10 *>
  
    <* 2.2.4 termout.
    *>
  
    procedure termout(stack);
 
    array stack;
 
    <*  This procedure is the reverse to procedure connectout (see
     above). It terminates the use of the file to which the zone OUT is
     currently connected, and makes the file to which the zone OUT was
     previously connected accessible for further processing.
  
       Call:
      
          termout(stack)
    
          stack           (call value, array) is expected to contain the
                          name of the BS-area on which the zone-descriptor
                          etc. was dumped when procedure connectout were
                          called.
    *>
   
    begin
  
       array  temp(1:2);
  
       integer block, file;
  
       integer array tail(1:10);
 
       temp(1) := stack(1);
       temp(2) := stack(2);
  
       outchar(out,25);                        <*   write endmark     *>
 
       monitor(42)lookup entry:(out,0,tail);
       if tail(1) >= 0
       then
       begin
          getposition(out,file,block);
          tail(1) := block + 1;
          monitor(44)change entry:(out,0,tail);
       end;
 
       close(out,true);                       <*   close             *>
       fpproc(30,0,out,temp);                 <*  and unstack file   *>
  
    end *** procedure termout ***;
\f

    <* 790614.            SLICELIST rel. 1.0               page 11 *>
 
    <* 2.2.5 Testoutput.
    *>
 
    procedure testoutput;
 
    <*   This procedure is intended only for maintaince purposes. It
      can be used to output the values/contents of the global decla-
      red variables listed below.
 
        cylinder, segment, slice.
   
        pda1, pda2.
   
        chaintable, entry, fdpd, ldpd, number_of_heads, slicelength.
   
         The procedure is executed only when test.yes is specified in
      the program call.
    *>
    
    begin
  
       boolean st;
       integer i, j, last_slice;
       real array field raf;
 
       st := false add 42;
   
       write(out,ff,1,nl,2,<:*** slicelist testoutput::>,
             nl,2,sp,6,<:modifier values::>,nl,1,sp,8,
             <:cylinder::>,sp,3, if cylinder then <:true:>
             else <:false:>,nl,1,sp,8,<:segment::>,sp,4,
             if segment then <:true:> else <:false:>,nl,1,sp,8,
             <:slices::>,sp,5,if slice then <:true:> else
             <:false:>,nl,2,sp,6,<:varible values::>,nl,2,
             <<dd ddd ddd>,sp,8,
             <:pda1::>,pda1(1),nl,1,sp,8,<:pda2::>,pda2(1),
             nl,1,sp,8,<:slicelength:  :>,slicelength,
             nl,1,sp,8,<:no of heads:  :>,number_of_heads,
             nl,1,sp,8,<:first segment::>,ldpd(3),nl,2,sp,6,
             <:ldpd and fdpd values::>,nl,1);
 
       j := 22;
       for i := 1 step 1 until 4 do
          write(out,nl,1,sp,8,<:ldpd(:>,<<d>,i,<:):   +:>,<<dd>,
                j + i * 2,<:: :>,<<dd ddd ddd>,ldpd(i),sp,4,
                case i of (<:chaintable:>,<:slicelength:>,
                           <:first segment:>,<:no. of segments:>));
 
       j := 26;
       write(out,nl,1);
       for i := 1 step 1 until 6 do
          write(out,nl,1,sp,8,<:fdpd(:>,<<d>,i,<:):   +:>,<<dd>,
                j + i * 2,<:: :>,<<dd ddd ddd>,fdpd(i),sp,4,
                case i of (<:firtst segment:>,<:no. of segments:>,
                           <:segms. per track:>,<:flags:>,
                           <:segms. per cyl.:>,<:odd cyl shift:>));
 
       write(out,nl,2,sp,6,<:catalog entry values::>,nl,1,sp,8,
             <:entry1::>,sp,3,<<dddd>,entry(1) shift (-12),
             sp,3,entry(1) extract 12 shift (-3),sp,3,entry(1)
             extract 3);
\f

    <* 790614.            SLICELIST rel. 1.0               page 12 *>
 
 
       raf := 6; i := 1;
     
       write(out,nl,1,sp,8,<:entry4::>,sp,3,string 
             entry.raf(increase(i)),nl,1,sp,8,<:entry8::>,sp,3,
             <<dddd>,entry(8));
  
       raf := 16; i := 1;
       write(out,nl,1,sp,8,<:entry9::>,sp,3,string
             entry.raf(increase(i)));
   
 
       last_slice := ldpd(4)/ldpd(2);
     
       write(out,ff,1,nl,1,sp,6,<:chaintable dump::>,nl,2,
             sp,8,<:no. of slices::>,<<ddd ddd>,last_slice,
             nl,2,sp,15,st,71,nl,1,sp,15,st,1);
   
       for i := 0 step 1 until 9 do
          write(out,<<dddd>,i,sp,2,st,1);
  
       write(out,nl,1,sp,8,st,78);
   
       baf := 1; j := 0;
  
       while j < last_slice and j < 2048 do
       begin
          if j mod 10 = 0
          then write(out,nl,1,sp,8,st,1,<<ddddd>,j,sp,1,st,1);
   
          i := chaintable.baf(j) extract 12;
          if i > 2048
          then i := i - 4096;
          write(out,<<-dddd>,i,sp,1,st,1);
          j := j + 1;
       end *** while j < last_slice do ***;
   
    end *** procedure testoutput ***;
\f

    <* 790614.            SLICELIST rel. 1.0               page 13 *>
 
    <* 2.2.6 Writeentry.
    *>
  
    procedure writeentry(entry);
    integer array        entry;
  
    <*  This procedure outputs a catalog entry, which describes a
      BS-area, with the same format as the one used by the 
      program LOOKUP.
    *>
  
    begin
       integer i, permkey, scope;
       long array bases(1:4);
       long base;
       real r;
       integer array field iaf;
       real array field raf;
 
       i := 1; raf := 6;
       write(out,sp,14 - write(out,nl,2,string entry.raf(
                                    increase(i))),
             <:= set :>,entry(8));
  
       i:= 1; raf := 16;
       write(out,sp,1,string entry.raf(increase(i)),sp,1);
 
       if entry(13) <> 0
       then write(out,<:d.:>,<<dddddd>,systime(6,entry(13),r),
                  <:.:>,<<dddd>,r/100,sp,1)
       else write(out,<:0:>,sp,1);
  
       for i := 14, 15, 16, 17 do
       begin
          if entry(i) shift (-12) <> 0
          then write(out,<<d>, entry(i) shift (-12),<:.:>);
          write(out,<<d>, entry(i) extract 12, sp,1);
       end;
  
       iaf := 0;
       system(11,0,bases.iaf);
       base := extend entry(2) shift 24 add entry(3);
       permkey := entry(1) extract 3;
  
       scope := if permkey <= 2 and base = bases(2)
                then 1 + permkey//2
                else
                if permkey = 3
                then 2 + ( if base = bases(3)
                         then 1
                         else
                         if base = bases(4)
                         then 2
                         else
                         if extend entry(2) <= extend bases.iaf(7) and
                            extend entry(3) >= extend bases.iaf(8)
                         then 3
                         else 4)
                else 6;
 
       write(out,<: ; :>,case scope of (<:temp:>,<:login:>,<:user:>,
                                         <:project:>,<:system:>,<:***:>),
             nl,1,sp,12,<:; :>,entry(1) shift (-12), entry(1) extract 12
             shift (-3), entry(1) extract 3,entry(2), entry(3),
             nl,1,sp,12,<:;:>);
  
    end *** procedure writeentry ***;
\f

    <* 841009.            SLICELIST rel. 1.0               page 14 *>
 
    <* 2.2.7 Writeslices.
    *>
  
    procedure writeslices(entry,chaintable);
    integer array         entry;
    boolean array               chaintable ;
  
    <*  This procedure performs the computations and the printing of
      the surveys, which are selected by the setting of the modifiers.
 
        The computations are based on the two parameters entry
      and chaintable, which contains the catalog entry for the
      file being processed and the chaintable for the logical
      disc on which it is stored.
  
        Furthermore the procedure references the following global
      declared variables:
  
        ldpd, fdpd, pda1, pda2, kind, cylinder, segment, slice,
        slicelength, and number_of_heads.
    *>
   
    begin
       integer i, j,      <* index                         *>
                          <*                               *>
               mode,      <* used to determine what survey,*>
                          <* concerning the slice and seg- *>
                          <* ment numbers, that is to be   *>
                          <* produced.                     *>
                          <*                               *>
               no,        <* index, and when the slicenum- *>
                          <* bers are collected from the   *>
                          <* chaintable the number of these*>
                          <*                               *>
               offset,    <* used when collecting the slice*>
                          <* numbers from the chaintable.  *>
                          <* the value to be added to the  *>
                          <* current index to obtain the   *>
                          <* number of the next slice.     *>
                          <*                               *>
               size,      <* the size of the file          *>
                          <*                               *>
               slno;      <* slicenumber                   *>
  
   
       write(out,nl,1,sp,12,<:;:>,nl,1,sp,12,<:;:>,sp,3,
             <:logical disc characteristics::>,nl,1,sp,12,
             <:;:>,nl,1,sp,12,<:;:>,<<dddd ddd>,sp,4,
             <:slicelength::>,sp,4,slicelength,nl,1,sp,12,
             <:;:>,sp,4,<:first segment::>,sp,2,ldpd(3),
             nl,1,sp,12,<:;:>,sp,4,<:no. of segments::>,
             ldpd(4),nl,1,sp,12,<:;:>,nl,1,sp,12,<:;:>,sp,3,
             <:physical disc characteristics::>,nl,1,sp,12,
             <:;:>,nl,1,sp,12,<:;:>,sp,4,<<ddd ddd>,
             <:process desciption addr::>,if pda2(1) = 0
             then pda1(1) else pda2(1));
            
        if kind(1)=6 <*ida disc*> then
          write(out,nl,1,sp,12,<:;:>)
        else
          write(out,nl,1,sp,12,<:;:>,sp,4,
             <:segm. per cyl.::>,fdpd(5),nl,1,sp,12,<:;:>,sp,4,
             <:odd cyl. shift::>,fdpd(6),nl,1,sp,12,<:;:>);
\f

    <* 790618.            SLICELIST rel. 1.0               page 15 *>
  
  
       size := entry(8);
       slno := (size + slicelength -1)//slicelength;
   
       if size > 0 and ( cylinder or segment or slice)
       then
       begin
          integer array sliceno(1:slno);
 
          no := 0;
          slno := entry(1) shift (-12);
  
          <* The slicenumbers are collected from the chaintable. *>
  
          repeat
             no := no + 1;
             sliceno(no) := slno;
             offset := chaintable(slno) extract 12;
             slno := slno + (if offset > 2047 then offset - 4096
                             else offset);
          until offset = 0;
  
          <* The slicenumbers are sorted in ascending  ordrer.
             The sortingmethod used is: bubblesort.           *>
   
          if no > 1
          then
          begin
             for j := no - 1 step -1 until 1 do
                for i := 1 step 1 until j do
                if sliceno(i) > sliceno(i+1)
                then
                begin
                   slno := sliceno(i + 1);
                   sliceno(i + 1) := sliceno(i);
                   sliceno(i) := slno;
                end;
          end;
\f

    <* 790618.            SLICELIST rel. 1.0               page 16 *>
  
  
  
          <* The survey of the slice and/or segment numbers is
             printed.
          *>
   
          mode := if slice and segment
                  then 3
                  else
                  if slice or segment
                  then 2
                  else 1;
   
          write(out,nl,1,sp,12,<:;:>,sp,3,<:number of slices::>,
                <<ddd ddd>,no);
          write(out,nl,1,sp,12,<:;:>,nl,1,sp,12,<:;:>,sp,3,
                case mode of (<::>,if slice then <:slicenumbers:>
                              else <:segmentnumbers:>,
                              <:slice and segment numbers:>),
                nl,1,sp,12,<:;:>,nl,1,sp,12,<:;:>);
    
          i := 0;
   
          case mode of
          begin
    
             <* slice.no and segment.no - no action *>;

   
             <* slice.yes or segment.yes            *>
   
             while i < no do
             begin
                if i mod 5 = 0
                then write(out,nl,1,sp,12,<:;:>,sp,4);
                i := i + 1;
                write(out,<<ddd ddd>,if slice then sliceno(i)
                      else sliceno(i) * slicelength,sp,4);
             end *** while i < no do ***;
   
   
             <* slice.yes and segment.yes           *>
  
             begin
                for j := 1 step 1 until (if no = 1 then 1
                                         else 2)
                do write(out,sp,4,<:sliceno:>,sp,3,<:segm. no.:>);
  
                j := no//2 + no mod 2;
                slno := j;
   
                repeat
                   i := i + 1;
                   j := j + 1;
                   write(out,nl,1,sp,12,<:;:>,sp,3,<<ddd ddd>,
                         sliceno(i),sp,4,sliceno(i) * slicelength);
  
                   if j <= no
                   then write(out,sp,5,<<ddd ddd>,sliceno(j),sp,4,
                              sliceno(j) * slicelength);
                until i = slno;
   
             end;
  
          end *** case mode of ***;
\f

    <* 841009.            SLICELIST rel. 1.0               page 17 *>
 
 
       <* The survey showing the distribution of the slices on
         cylinders is computed and printed.
       *>
   
   
          if cylinder and kind(1)=6 <*ida disc*> then
              write(out,nl,1,sp,12,<:;:>,nl,1,sp,12,<:;:>,sp,3,
                    <:cylinder option not possible on rc83xx discs:>,
                    nl,1,sp,12,<:;:>)
          else
          if cylinder
          then
          begin
             integer cylno1,         <* the number of the cylinder *>
                                     <* for which there is being   *>
                                     <* counted slices.            *>
                     cylno2,         <* the number of the cylinder *>
                                     <* on which the first segment *>
                                     <* of the current slice is    *>
                                     <* located.                   *>
                     cylno3,         <* the number of the cylinder *>
                                     <* on which the last segment  *>
                                     <* of the current slice is    *>
                                     <* located.                   *>
                                     <*                            *>
                     first_cylno,    <* the number of the first    *>
                                     <* cylinder of the logical    *>
                                     <* disc on the physical disc. *>
                                     <*                            *>
                     first_segment,  <* the number of the first    *>
                                     <* segment of the logical disc*>
                                     <* on the physical disc.      *>
                                     <*                            *>
                     segm_per_cyl;   <* segments per cylinedr.     *>
             
    
             real    part,           <* used when a slice is divi- *>
                                     <* ded on two cylinders.      *>
                                     <* '1 - part' is the part of  *>
                                     <* the slice located on cylin-*>
                                     <* der 'cylno2' and 'part' is *>
                                     <* the part of the slice loca-*>
                                     <* ted on cylinder 'cylno3'.  *>
                                     <*                            *>
                     slices;         <* the number of slices, coun-*>
                                     <* ted until now, on cylinder *>
                                     <* 'cylno1'                   *>
\f

    <* 790618.            SLICELIST rel. 1.0               page 18 *>
  
  
             write(out,nl,1,sp,12,<:;:>,nl,1,sp,12,<:;:>,sp,3,
                   <:cyl. no.:>,sp,3,<:no. of slices:>);
   
             segm_per_cyl := number_of_heads * 21;
             first_segment := ldpd(3);
             first_cylno := first_segment//segm_per_cyl;
             i := 0;
             slices := 0.0;
  
             cylno1 := (sliceno(1) * slicelength + first_segment)//
                        segm_per_cyl - first_cylno;
  
             repeat
                i := i + 1;
                cylno2 := (sliceno(i) * slicelength + first_segment)//
                          segm_per_cyl - first_cylno;
                cylno3 := (sliceno(i) * slicelength + slicelength - 1 +
                           first_segment)//segm_per_cyl - first_cylno;
  
                if cylno1 = cylno2 and cylno2 = cylno3
                then slices := slices + 1.0
                else
                begin
                   part := if cylno2 = cylno3 then 1.0
                            else (sliceno(i) * slicelength + slicelength +
                                  first_segment) mod segm_per_cyl/
                                                  slicelength;
  
                   if cylno1 = cylno2 
                   then slices := slices + 1 - part;
  
                   write(out,nl,1,sp,12,<:;:>,sp,5,<<dddd>,cylno1,sp,7,
                         <<ddd.dd>,slices);
  
                   if cylno1 <> cylno2 and cylno2 <> cylno3
                   then write(out,nl,1,sp,12,<:;:>,sp,5,<<dddd>,cylno2,
                              sp,7,<<ddd.dd>,1.0 - part);
  
                   cylno1 := cylno3;
                   slices := part;
                end;
  
             until i = no;
 
             write(out,nl,1,sp,12,<:;:>,sp,5,<<dddd>,cylno1,sp,7,
                   <<ddd.dd>,slices);
  
          end ***if cylinder then ***;
  
       end *** if size > 0 and ( cylider or segment or slice) ***;
  
    end *** procedure writeslices ***;
\f

    <* 790618.            SLICELIST rel. 1.0               page 19 *>
   
    <* 3. Initialization.
       __________________
    *>
  
    for j := 1 step 1 until 4 do
       for i := 1,2 do
          parameter(j,i) := case (j - 1) * 2 + i of
                               (real <:cylin:> add 100, real <:er:>,
                                real <:segme:> add 110, real <:t:>,
                                real <:slice:> , real <::>,
                                real <:test:>, real <::>);
    
    progname(1) := real <:slice:> add 108;
    progname(2) := real <:ist:>;
    
    yes := real <:yes:>;  no := real <:no:>;
  
    nl := false add 10; ff := false add 12; sp := false add 32;
   
    test := cylinder := segment := false; slice := true;
    
    finis := false;
   
    trapmode := 1 shift 10; 
    
  
  
    <* It is tested whether an <outfile> is specified in the
       program call, and if so it is tried to connect it.
    *>
  
    case fpparam(0,2,2,progname,items,itemtype) of
    begin
    
       alternate_outfile := false;
    
       if connectout(items, stack)
       then alternate_outfile := true
       else
       begin
          errormessage(1);
          alternate_outfile := false;
       end;
    
    end *** case fpparam of ***;
\f

    <* 790615.            SLICELIST rel. 1.0               page 20 *>
 
    <* 4. The central loop.
       ____________________
  
         The central loop comprises four actions, which each corre-
       sponds to one of the possible four returnvalues (-1, 0, 1, 2)
       delivered by procedure FPPARAM in the begining of the loop.
         The correspondence between the value of type and the action 
       which is to be performed is shown in the table listed below.
 
          type              action
  
            1      erroneous parameter  -  no action.
      
            2      end of parameter list  -  exit loop.
 
            3      The parameter has the form: <name>. It
                   is checked whether the parameter is the
                   name of a file stored on an RC82xx disc.
                   If so, then the surveys, which are selec-
                   ted by the setting of the modifiers, are
                   produced.

            4      The parameter has the form: <name>.<name> .
                   It is checked whether the parameter is a
                   <modifier>. If so, that modifier is set in
                   accordance with the parameter.
    *>
   
    
    
    repeat
    
       type := fpparam(0, 2, 2, progname, items, itemtype) + 2;
    
       case type of
       begin
    
          <* erroneous parameter  -  no action             *>;
    
          <* parameter list exhausted  - finis             *>
    
          finis := true;
\f

    <* 841009.            SLICELIST rel. 1.0               page 21 *>
   
  
          begin
             <* the parameter is expected to be a filename   *>
    
             iaf := 0;
             getzone6(z, ib);
             for i := 1, 2, 3, 4 do
                ib(i + 1) := items.iaf(i);
             setzone6(z, ib);
    
             if monitor(76)lookup head and tail:(z, i, entry) <> 0
             then errormessage(2)
             else
             if entry(8) < 0
             then errormessage(3)
             else
             begin
                getzone6(z,ib);
                for i := 2, 3, 4, 5 do
                   ib(i) := entry(i + 7);
                setzone6(z,ib);
 
                <* Get the addr. of the logical disc process
                   description.
                *>
                pda1(1) := monitor(4)process description:(z,0,ib);
   
                if pda1(1) <> 0
                then system(5,pda1(1),kind);
    
                if pda1(1) = 0
                then errormessage(4)
                else
                 <* Check whether the process description describes
                    an RC82xx/RC83xx disc or not.          
                 *>
                if kind(1) <> 62 and kind(1) <> 6
                then errormessage(6)
                else
                begin
                   <* Get the addr. of the physical disc
                      process description.
                   *>
     
                   system(5, pda1(1) + 10, pda2);
 
                   <* Get a part of the process description for the
                      logical disc.
                   *>
 
                   system(5, pda1(1) + 24, ldpd);
 
                   <* Get a part of the process description for the
                      physical disc.
                   *>
 
                   system(5, 28 + (if pda2(1) = 0 then pda1(1)
                                   else pda2(1)), fdpd);
\f

    <* 841009.            SLICELIST rel. 1.0               page 22 *>
  
  
 
                   <* Get the chaintable for the actual disc.   *>
 
                   system(5, ldpd(1), chaintable);
 
                   <* The retrived parts of the process descriptions
                      for the logical disc and for the physical disc
                      are:
  
                         logical disc
                           ldpd(1): +24: chaintable addr.
                           ldpd(2): +26: slicelength.
                           ldpd(3): +28: first segm. (on phys. disc)
                           ldpd(4): +30: number of segments.
 
                         physical disc
                           fdpd(1): +28: first segm.
                           fdpd(2): +30: number of segments.
                           fdpd(3): +32: segm. per track.
                           fdpd(4): +34: flags.
                           fdpd(5): +36: segm. per cylinder.
                           fdpd(6): +38: odd cylinder shift.
                   *>
 
 
                   slicelength := ldpd(2);
                   number_of_heads := if kind(1)=6 <*ida disc*> then 1 else fdpd(5)/fdpd(3);
 
                   <* The adjustment of number_of_heads made below
                      is performed only when the file is stored on 
                      the fixed-head part of an RC8233 disc. It is
                      done to ensure that the computations of the
                      distribution of the slices on cylinders are per-
                      formed correct.(e.i. the fixed-head part of the
                      disc is wieved as a seperate disc with one sur-
                      face and one head.)
                    *>
 
                   if number_of_heads = 4 and ldpd(3) = 4
                   then number_of_heads := 1;
 
                   baf := 1;
  
                   writeentry(entry);
                   writeslices(entry, chaintable.baf);
 
                   if test
                   then testoutput;
 
 
                end;
 
             end;
 
          end *** filename parameter ***;
  
\f

    <* 790618.            SLICELIST rel. 1.0               page 23 *>
   
    
    
          <* the parameter is expected to be a modifier    *>
    
          if items(3) = yes or items(3) = no
          then
          begin
  
             i := 0;
             repeat
                i := i + 1;
             until i = 5 or items(1) = parameter(i,1) and
                            items(2) = parameter(i,2);
    
             case i of
             begin
                cylinder := items(3) = yes;
                segment  := items(3) = yes;
                slice    := items(3) = yes;
                test     := items(3) = yes;
                errormessage(5);
             end;
    
          end
          else errormessage(5);
    
       end *** case type of ***;
    
    until finis;
\f

    <* 81.08.10.            SLICELIST rel. 1.0               page 24 *>
 
    <* 5. Program termination.
       _______________________
    *>

    outchar (out, 10);
    
    if alternate_outfile
    then termout(stack);
    
 end \f

** program slicelist ***;


▶EOF◀