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

⟦b96950f77⟧ TextFile

    Length: 9216 (0x2400)
    Types: TextFile
    Names: »tdiscstat«

Derivation

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

TextFile


discstat version: 7   date: 21.02.78

begin

<* pej 09.02.78    discstat                                page 1


discstat
--------
the program extracts statistical information from a disc driver
and prints the information on current output.

example
-------
the following command extracts statistics about the disc to which
the disc driver process named 'disc2' is connected:
          discstat disc.disc2
the following command creates the peripheral process
'disc2auto' on device 12:
          discstat disc.disc2auto.12

call
----
                                      1
discstat <s> disc.<drivername> <device>
                                      0
<device>::= .<devicenumber>

function
--------
the program sends a message to the specified driver to
collect the statistics. the driver may be either a logical or
a physical disc driver - in either case the statistics concerns
the information created by a physical driver. please note that
the driver will reset its statistics when the information has
been collected.
if <device> is specified the program creates a peripheral
process named <drivername> to the device.

error messages
--------------
syntax
    syntax error in call.
buffer claim exceeded
    no message buffer available.
monitor result <result>
    a normal answer was not received from the disc driver. <result>
    is the result delivered in the answer to the message.
create <result>
   not possible to create a peripheral process for a
   reason given by <result>.
status error <status>
   <status> is the (decimal) statusword received from
   the disc driver.


*>
\f


<* pej 09.02.78    discstat                             page 2 *>

procedure write_disc_statistics(z,ra);
zone                            z    ; <* output zone *>
real array                        ra ; <* disc driver statistics *>

begin
  integer field accesses, errors, ecc_correc, rep_correc;
  boolean field neg, pos, late, late_neg, late_pos, early,
                early_neg, early_pos;
  boolean array field magnitude;
  boolean array field compound;
  boolean array field detailed;
  integer array field segments;
  integer field segm_no;
  boolean field in_ok, in_rep, out_ok, out_rep;
  integer i;
  boolean sp, nl;

  sp:= false add 32; nl:= false add 10;

  accesses:= 2; errors:= 4; ecc_correc:= 6; rep_correc:= 8;

  neg:= 9; pos:= 10; late:= 12; late_neg:= 13; late_pos:= 14;
  early:= 16; early_neg:= 17; early_pos:= 18;

  magnitude:= 19; compound:= 34; detailed:= 58;

  segments:= 82;
  segm_no:= 2;
  in_ok:= 3; in_rep:= 4; out_ok:= 5; out_rep:= 6;
\f


<* pej 09.02.78    discstat                             page 3 *>

  write(z,<<ddddddd>,nl,3,
  <:number of accesses:>,sp,17,ra.accesses,nl,3,
  <:errors in first attempt:>,sp,12,ra.errors,nl,1,
  <:errors corrected solely by ecc:>,sp,5,ra.ecc_correc,nl,1,
  <:errors corrected within 3 retries:>,sp,2,ra.rep_correc,nl,3);

  write(z,<<dddd>,
  <:errors corrected by::>,nl,1,
  <:  neg offset:>,sp,17,ra.neg extract 12,nl,1,
  <:  pos offset:>,sp,17,ra.pos extract 12,nl,1,
  sp,15,<:late strobe:>,sp,3,ra.late extract 12,nl,1,
  <:  neg offset + late strobe:>,sp,3,ra.late_neg extract 12,nl,1,
  <:  pos offset + late strobe:>,sp,3,ra.late_pos extract 12,nl,1,
  sp,15,<:early strobe:>,sp,2,ra.early extract 12,nl,1,
  <:  neg offset + early strobe:>,sp,2,ra.early_neg extract 12,nl,1,
  <:  pos offset + early strobe:>,sp,2,ra.early_pos extract 12,nl,3);

  write(z,
  <:errors corrected by offset magnitude::>,nl,1,
  <:  -01- -02- -03- -04- -05- -06- -07- :>,
  <:-08- -09- -10- -11- -12- -13- -14- -15-:>,nl,1,sp,2);
  for i:= 1 step 1 until 15 do
  write(z,<<dddd>,ra.magnitude(i) extract 12,sp,1);

  write(z,nl,3,
  <:occurrencies of::>,nl,1);
  for i:= 7,8,12,9,10,11,          <* curr status *>
          1,2,4,5,6,21,22,23,24,   <* event status *>
          20,19,18,17,16,15,14 do  <* i/o result *>
  write(out,case i of (
  <:  event status bit  0   intervention             :>,
  <:                    1   data error (parity)      :>,
  <::>,
  <:                    3   data overrun             :>,
  <:                    4   hard error               :>,
  <:                    5   position error           :>,
  <:  curr status bit   0   power low                :>,
  <:                    1   local                    :>,
  <:                    8   write protect            :>,
  <:                    9   high density             :>,
  <:                   10   mode                     :>,
  <:                    5   seek error               :>,
  <::>,
  <:                    6   power restart            :>,
  <:                    5   wait progr. termination  :>,
  <:                    4   abnorm. termination      :>,
  <:                    3   software timeout         :>,
  <:                    2   bus timeout              :>,
  <:                    1   bus reject               :>,
  <:  i/o result        0   normal termination       :>,
  <:                   20   bus communication error  :>,
  <:                   21   interrupt error          :>,
  <:                   22   bus timeout              :>,
  <:                   23   bus parity error         :>),
  <<dddd>,ra.compound(i) extract 12,nl,1);
\f



<* pej 09.02.78    discstat                             page 5 *>

  write(z,nl,2,
  <:occurrencies of detailed statusbit::>,nl,1,
  <:  -00- -01- -02- -03- -04- -05- -06- -07- -08- -09- -10- -11-:>,
  nl,1,sp,2);
  for i:= 1 step 1 until 12 do
  write(z,<<dddd>,ra.detailed(i) extract 12,sp,1);
  write(z,nl,2,
  <:  -12- -13- -14- -15- -16- -17- -18- -19- -20- -21- -22- -23-:>,
  nl,1,sp,2);
  for i:= 13 step 1 until 24 do
  write(z,<<dddd>,ra.detailed(i) extract 12,sp,1);

  if ra.segments.segm_no <> -1 then
  begin
    write(z,nl,3,
    <:segment   successful   input op.   successful   output op.:>,
    nl,1,
    <:number    input op.    with rep.   output op.   with rep.:>,
    nl,1);
    for segments:= 82 step 6 until 136 do
    if ra.segments.segm_no = -1
    then segments:= 137
    else
    write(z,
    sp,1,<<dddddd>,ra.segments.segm_no,
    sp,6,<<dddd>,ra.segments.in_ok extract 12,
    sp,8,ra.segments.in_rep extract 12,
    sp,9,ra.segments.out_ok extract 12,
    sp,9,ra.segments.out_rep extract 12,nl,1);
  end
  else
  write(z,nl,3,<:no error segments detected:>,nl,1);

end;
\f


<* pej 09.02.78    discstat                             page 6 *>

integer statistics_length;
statistics_length:= 142; <* no of bytes *>

begin

  zone z(statistics_length,1,stderror);
  integer array ia(1:20);
  integer i,i1, base_buffer_area;
  real array discname(1:2), ra(1:2);
  real time, r;

  if system(4,2,discname) <> 8 shift 12 add 10
  then write(out,<:<10>*** discstat: syntax:>)
  else
  begin
    systime(1,0,time);
    i:= 1;
    write(out,<:<10><10>disc statistics, disc: :>,
          string discname(increase(i)),<:   date: :>,<<dd dd dd>,
          systime(4,time,r),<:   time: :>,r,<:<10>:>,
          false add 45,76,<:<10>:>);

    i:= 1;
    open(z,0,string discname(increase(i)),0);
    if system(4,3,ra) = 8 shift 12 add 4 then
    begin
      i:= ra(1);
      i:= monitor(54)create_peripheral:(z,i,ia);
    end
    else i:= 0;
    if i <> 0 and i <> 3
    then write(out,<:<10>*** discstat: create, :>,
               case i of (
               <:function forbidden in calling process:>,
               <:calling proc not user; catalog i/o error:>,
               <:name conflict:>,
               <:device no does not exist:>,
               <:device is reserved by another user:>,
               <:name format illegal:>))
    else
    begin
    getzone6(z,ia);
    base_buffer_area:= ia(19);
    ia(14):= base_buffer_area;  <* record base *>
    ia(16):= statistics_length; <* record length *>
    setzone6(z,ia);

    getshare6(z,ia,1);
    ia(4):= 9 shift 12; <* operation *>
    ia(5):= base_buffer_area + 1; <* firstaddr *>
    ia(6):= ia(5) + statistics_length - 2; <* lastaddr *>
    setshare6(z,ia,1);

    if 0 = monitor(16)send_message:(z,1,ia)
    then write(out,<:<10>*** discstat: buffer claim exceeded:>)
    else
    begin

      i:= monitor(18)wait_answer:(z,1,ia);
      if i <> 1
      then write(out,<:<10>*** discstat: monitor result, :>,
                 case i - 1 of (
                 <:message rejected:>,
                 <:message unintelligible:>,
                 <:receiver malfunction:>,
                 <:receiver does not exist:>))
      else
      if ia(1) <> 0
      then write(out,<:<10> discstat: status error, :>,ia(1))
      else
      begin
        write_disc_statistics(out,z);
        write(out,<:<10>:>);
        for i:= 5, 6, 7 do
        begin
          write(out,<:<10>:>,case i-4 of (
               <:latest sensed curr status    :>,
               <:              event status   :>,
               <:              detailed status:>),<:   :>);
          for i1:= -23 step 1 until 0 do
          write(out,if ia(i) shift i1 extract 1 = 0
                    then <:.:> else <:1:>);
        end;
      end;
    end;
    end;
  end;

  write(out,<:<10><10><10><10>:>);
end;
end;
▶EOF◀