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

⟦28864ee40⟧ TextFile

    Length: 42240 (0xa500)
    Types: TextFile
    Names: »tsystest3   «

Derivation

└─⟦9ccaf6601⟧ Bits:30008165 Bånd med SW8000 kildetekst/release værktøjer
    └─⟦f546e193b⟧ 
        └─⟦this⟧ »tsystest3   « 

TextFile

  message de enkelte testprocedurer part 1 (tsystest3);

  boolean procedure test_proc (testno);
  value testno;
  integer testno;
  begin
    long antal;
    integer i, j, k;
    integer array ia (1 : 20);
    long array la (1 : 2);

    <* statusinformation *>
    long array sidst_rørt (1 : antdiske);
    integer array antal_io, segment_nr, blok_lgd,
    bs_nr, antal_fejl, aktivitet (1 : antdiske);
    integer first_buf, last_buf;
\f


    boolean procedure ens_i (txt1, formel, i1, i2, i3, i4);
    value i1, i2, i3, i4;
    string txt1, formel;
    integer i1, i2, i3, i4;
    begin <* i1 ? i2 = i3 og i4 er forventet *>
      if i3 <> i4 then
      begin <* fejl *>
        ens_i := false;

        fejl (<:Fejl ved:>, - 1);
        write (out, <<d>,
          txt1, <: (:>, i1, "sp", 1, formel, "sp", 1, i2, <:):>,
          "nl", 1, <:beregnet: :>, true, 10, i3,
          "nl", 1, <:forventet::>, true, 10, i4,
          "nl", 1, <:forskel:  :>, true, 10, abs (i3 - i4));
        if online then setposition (out, 0, 0);

        if pause then system (10, 1, <:<10>pause pga fejl:>); <* pause *>
      end fejl
      else ens_i := true;
    end procedure ens_i;

    boolean procedure ens_l (txt1, formel, l1, l2, l3, l4);
    value l1, l2, l3, l4;
    string txt1, formel;
    long l1, l2, l3, l4;
    begin <* l1 ? l2 = l3 og l4 er forventet *>
      if l3 <> l4 then
      begin <* fejl *>
        ens_l := false;

        fejl (<:Fejl ved:>, - 1);
        write (out, <<d>,
          txt1, <: (:>, l1, "sp", 1, formel, "sp", 1, l2, <:):>,
          "nl", 1, <:beregnet: :>, true, 16, l3,
          "nl", 1, <:forventet::>, true, 16, l4,
          "nl", 1, <:forskel:  :>, true, 16, abs (l3 - l4));
        if online then setposition (out, 0, 0);

        if pause then system (10, 1, <:<10>pause pga fejl:>); <* pause *>
      end fejl
      else ens_l := true;
    end procedure ens_l;

    boolean procedure ens_r (txt1, formel, r1, r2, r3, r4);
    value r1, r2, r3, r4;
    string txt1, formel;
    real r1, r2, r3, r4;
    begin <* r1 ? r2 = r3 og r4 er forventet *>
      real afv;

      afv :=
      if r3 = r4 then 0
      else
      if r3 = 0 or r4 = 0 then abs (r4 - r3)
      else abs ((r4 - r3) / r4);

      if afv > 1.0'-10 then
      begin <* fejl *>
        ens_r := false;

        fejl (<:Fejl ved:>, - 1);
        write (out, <<d.ddddddddd'-ddd>,
          txt1, <: (:>, r1, "sp", 1, formel, "sp", 1, r2, <:):>,
          <<-d.ddddddddd'-ddd>,
          "nl", 1, <:beregnet: :>, r3,
          "nl", 1, <:forventet::>, r4,
          "nl", 1, <:forskel:  :>, r4 - r3,
          <<d.dd>, <: (afvigelsesfaktor :>, afv, <:):>);
        if online then setposition (out, 0, 0);

        if pause then system (10, 1, <:<10>pause pga fejl:>); <* pause *>
      end fejl
      else ens_r := true;
    end procedure ens_r;
\f


    procedure test_integer;
    begin <* test integer regning *>
      if datawrite or datatest then d_init (testno); <* open og positioner *>

      for i1 := - 900 step 100 until - 100,
      - 90 step 10 until - 10,
      - 9 step 1 until - 1,
      0,
      1 step 1 until 9,
      10 step 10 until 90,
      100 step 100 until 900 do
      for i2 := - 900 step 100 until - 100,
      - 90 step 10 until - 10,
      - 9 step 1 until - 1,
      0,
      1 step 1 until 9,
      10 step 10 until 90,
      100 step 100 until 900 do
      begin
        i3 := i1 + i2;
        if datawrite then d_iwrite (i3)
        else ens_i (<:integer-addition:>, <:+:>, i1, i2, i3, d_iread);
      end;

      for i1 := - 900 step 100 until - 100,
      - 90 step 10 until - 10,
      - 9 step 1 until - 1,
      0,
      1 step 1 until 9,
      10 step 10 until 90,
      100 step 100 until 900 do
      for i2 := - 900 step 100 until - 100,
      - 90 step 10 until - 10,
      - 9 step 1 until - 1,
      0,
      1 step 1 until 9,
      10 step 10 until 90,
      100 step 100 until 900 do
      begin
        i3 := i1 - i2;
        if datawrite then d_iwrite (i3)
        else ens_i (<:integer-subtraktion:>, <:-:>, i1, i2, i3, d_iread);
      end;

      for i1 := - 900 step 100 until - 100,
      - 90 step 10 until - 10,
      - 9 step 1 until - 1,
      0,
      1 step 1 until 9,
      10 step 10 until 90,
      100 step 100 until 900 do
      for i2 := - 900 step 100 until - 100,
      - 90 step 10 until - 10,
      - 9 step 1 until - 1,
      0,
      1 step 1 until 9,
      10 step 10 until 90,
      100 step 100 until 900 do
      begin
        i3 := i1 * i2;
        if datawrite then d_iwrite (i3)
        else ens_i (<:integer-multiplikation:>, <:*:>, i1, i2, i3, d_iread);
      end;

      for i1 := - 900 step 100 until - 100,
      - 90 step 10 until - 10,
      - 9 step 1 until - 1,
      0,
      1 step 1 until 9,
      10 step 10 until 90,
      100 step 100 until 900 do
      for i2 := - 900 step 100 until - 100,
      - 90 step 10 until - 10,
      - 9 step 1 until - 1,
      1 step 1 until 9,
      10 step 10 until 90,
      100 step 100 until 900 do
      begin
        i3 := i1 // i2;
        if datawrite then d_iwrite (i3)
        else ens_i (<:integer-division:>, <://:>, i1, i2, i3, d_iread);
      end;

      for i1 := - 900 step 100 until - 100,
      - 90 step 10 until - 10,
      - 9 step 1 until - 1,
      0,
      1 step 1 until 9,
      10 step 10 until 90,
      100 step 100 until 900 do
      for i2 := - 900 step 100 until - 100,
      - 90 step 10 until - 10,
      - 9 step 1 until - 1,
      1 step 1 until 9,
      10 step 10 until 90,
      100 step 100 until 900 do
      begin
        i3 := i1 mod i2;
        if datawrite then d_iwrite (i3)
        else ens_i (<:integer-modelo:>, <:mod:>, i1, i2, i3, d_iread);
      end;

      if datawrite or datatest then d_exit; <* close *>
    end procedure test_integer;
\f


    procedure test_long;
    begin <* test long regning *>
      if datawrite or datatest then d_init (testno); <* open og positioner *>

      for l1 := - 900 step 100 until - 100,
      - 90 step 10 until - 10,
      - 9 step 1 until - 1,
      0,
      1 step 1 until 9,
      10 step 10 until 90,
      100 step 100 until 900 do
      for l2 := - 900 step 100 until - 100,
      - 90 step 10 until - 10,
      - 9 step 1 until - 1,
      0,
      1 step 1 until 9,
      10 step 10 until 90,
      100 step 100 until 900 do
      begin
        l3 := l1 + l2;
        if datawrite then d_lwrite (l3)
        else ens_l (<:long-addition:>, <:+:>, l1, l2, l3, d_lread);
      end;

      for l1 := - 900 step 100 until - 100,
      - 90 step 10 until - 10,
      - 9 step 1 until - 1,
      0,
      1 step 1 until 9,
      10 step 10 until 90,
      100 step 100 until 900 do
      for l2 := - 900 step 100 until - 100,
      - 90 step 10 until - 10,
      - 9 step 1 until - 1,
      0,
      1 step 1 until 9,
      10 step 10 until 90,
      100 step 100 until 900 do
      begin
        l3 := l1 - l2;
        if datawrite then d_lwrite (l3)
        else ens_l (<:long-subtraktion:>, <:-:>, l1, l2, l3, d_lread);
      end;

      for l1 := - 900 step 100 until - 100,
      - 90 step 10 until - 10,
      - 9 step 1 until - 1,
      0,
      1 step 1 until 9,
      10 step 10 until 90,
      100 step 100 until 900 do
      for l2 := - 900 step 100 until - 100,
      - 90 step 10 until - 10,
      - 9 step 1 until - 1,
      0,
      1 step 1 until 9,
      10 step 10 until 90,
      100 step 100 until 900 do
      begin
        l3 := l1 * l2;
        if datawrite then d_lwrite (l3)
        else ens_l (<:long-multiplikation:>, <:*:>, l1, l2, l3, d_lread);
      end;

      for l1 := - 900 step 100 until - 100,
      - 90 step 10 until - 10,
      - 9 step 1 until - 1,
      0,
      1 step 1 until 9,
      10 step 10 until 90,
      100 step 100 until 900 do
      for l2 := - 900 step 100 until - 100,
      - 90 step 10 until - 10,
      - 9 step 1 until - 1,
      1 step 1 until 9,
      10 step 10 until 90,
      100 step 100 until 900 do
      begin
        l3 := l1 // l2;
        if datawrite then d_lwrite (l3)
        else ens_l (<:long-division:>, <://:>, l1, l2, l3, d_lread);
      end;

      for l1 := - 900 step 100 until - 100,
      - 90 step 10 until - 10,
      - 9 step 1 until - 1,
      1 step 1 until 9,
      10 step 10 until 90,
      100 step 100 until 900 do
      for l2 := - 900 step 100 until - 100,
      - 90 step 10 until - 10,
      - 9 step 1 until - 1,
      1 step 1 until 9,
      10 step 10 until 90,
      100 step 100 until 900 do
      begin
        l3 := l1 mod l2;
        if datawrite then d_lwrite (l3)
        else ens_l (<:long-modelo:>, <:mod:>, l1, l2, l3, d_lread);
      end;

      if datawrite or datatest then d_exit; <* close *>
    end procedure test_long;
\f


    procedure test_real;
    begin <* test real regning *>
      if datawrite or datatest then d_init (testno); <* open og positioner *>

      for r1 := - 900 step 100 until - 100,
      - 90 step 10 until - 10,
      - 9 step 1 until - 1,
      - 0.9 step 0.1 until - 0.1,
      - 0.09 step 0.01 until - 0.01,
      0,
      0.01 step 0.01 until 0.09,
      0.9 step 0.1 until 0.1,
      1 step 1 until 9,
      10 step 10 until 90,
      100 step 100 until 900 do
      for r2 := - 900 step 100 until - 100,
      - 90 step 10 until - 10,
      - 9 step 1 until - 1,
      - 0.9 step 0.1 until - 0.1,
      - 0.09 step 0.01 until - 0.01,
      0,
      0.01 step 0.01 until 0.09,
      0.1 step 0.1 until 0.9,
      1 step 1 until 9,
      10 step 10 until 90,
      100 step 100 until 900 do
      begin
        r3 := r1 + r2;
        if datawrite then d_rwrite (r3)
        else ens_r (<:real-addition:>, <:+:>, r1, r2, r3, d_rread);
      end;

      for r1 := - 900 step 100 until - 100,
      - 90 step 10 until - 10,
      - 9 step 1 until - 1,
      - 0.9 step 0.1 until - 0.1,
      - 0.09 step 0.01 until - 0.01,
      0,
      0.01 step 0.01 until 0.09,
      0.1 step 0.1 until 0.9,
      1 step 1 until 9,
      10 step 10 until 90,
      100 step 100 until 900 do
      for r2 := - 900 step 100 until - 100,
      - 90 step 10 until - 10,
      - 9 step 1 until - 1,
      - 0.9 step 0.1 until - 0.1,
      - 0.09 step 0.01 until - 0.01,
      0,
      0.01 step 0.01 until 0.09,
      0.1 step 0.1 until 0.9,
      1 step 1 until 9,
      10 step 10 until 90,
      100 step 100 until 900 do
      begin
        r3 := r1 - r2;
        if datawrite then d_rwrite (r3)
        else ens_r (<:real-subtraktion:>, <:-:>, r1, r2, r3, d_rread);
      end;

      for r1 := - 900 step 100 until - 100,
      - 90 step 10 until - 10,
      - 9 step 1 until - 1,
      - 0.9 step 0.1 until - 0.1,
      - 0.09 step 0.01 until - 0.01,
      0,
      0.01 step 0.01 until 0.09,
      0.1 step 0.1 until 0.9,
      1 step 1 until 9,
      10 step 10 until 90,
      100 step 100 until 900 do
      for r2 := - 900 step 100 until - 100,
      - 90 step 10 until - 10,
      - 9 step 1 until - 1,
      - 0.9 step 0.1 until - 0.1,
      - 0.09 step 0.01 until - 0.01,
      0,
      0.01 step 0.01 until 0.09,
      0.1 step 0.1 until 0.9,
      1 step 1 until 9,
      10 step 10 until 90,
      100 step 100 until 900 do
      begin
        r3 := r1 * r2;
        if datawrite then d_rwrite (r3)
        else ens_r (<:real-multiplikation:>, <:*:>, r1, r2, r3, d_rread);
      end;

      for r1 := - 900 step 100 until - 100,
      - 90 step 10 until - 10,
      - 9 step 1 until - 1,
      - 0.9 step 0.1 until - 0.1,
      - 0.09 step 0.01 until - 0.01,
      0,
      0.01 step 0.01 until 0.09,
      0.1 step 0.1 until 0.9,
      1 step 1 until 9,
      10 step 10 until 90,
      100 step 100 until 900 do
      for r2 := - 900 step 100 until - 100,
      - 90 step 10 until - 10,
      - 9 step 1 until - 1,
      - 0.9 step 0.1 until - 0.1,
      - 0.09 step 0.01 until - 0.01,
      0.01 step 0.01 until 0.09,
      0.1 step 0.1 until 0.9,
      1 step 1 until 9,
      10 step 10 until 90,
      100 step 100 until 900 do
      begin
        r3 := r1 / r2;
        if datawrite then d_rwrite (r3)
        else ens_r (<:real-division:>, <:/:>, r1, r2, r3, d_rread);
      end;

      if datawrite or datatest then d_exit; <* close *>
    end procedure test_real;
\f


    procedure test_exp;
    begin <* test exponentiations beregning *>
      if datawrite or datatest then d_init (testno); <* open og positioner *>

      for i1 := 0,
      1 step 1 until 9,
      10 step 10 until 90,
      100 step 100 until 900,
      1 000 step 1 000 until 9 000,
      10 000 step 10 000 until 90 000,
      100 000 step 100 000 until 900 000 do
      for i2 := - 99 step 1 until 100 do
      begin
        if i1 <> 0 or i2 > 0 then
        begin
          r3 := i1 ** i2;
          if datawrite then d_rwrite (r3)
          else ens_r (<:integer-exponentiation:>, <:**:>, i1, i2, r3, d_rread);
        end;
      end;

      for l1 := 0,
      1 step 1 until 9,
      10 step 10 until 90,
      100 step 100 until 900,
      1 000 step 1 000 until 9 000,
      10 000 step 10 000 until 90 000,
      100 000 step 100 000 until 900 000 do
      for l2 := - 99 step 1 until 100 do
      begin
        if l1 <> 0 or l2 > 0 then
        begin
          r3 := l1 ** l2;
          if datawrite then d_rwrite (r3)
          else ens_r (<:long-exponentiation:>, <:**:>, l1, l2, r3, d_rread);
        end;
      end;

      for r1 := 0,
      0.01 step 0.01 until 0.09,
      0.1 step 0.1 until 0.9,
      1 step 1 until 9,
      10 step 10 until 90,
      100 step 100 until 900,
      1 000 step 1 000 until 9 000,
      10 000 step 10 000 until 90 000,
      100 000 step 100 000 until 900 000 do
      for r2 := - 99 step 1 until 100 do
      begin
        if r1 > 0 then
        begin
          r3 := r1 ** r2;
          if datawrite then d_rwrite (r3)
          else ens_r (<:real-exponentiation:>, <:**:>, r1, r2, r3, d_rread);
        end;
      end;

      if datawrite or datatest then d_exit; <* close *>
    end procedure test_exp;
\f


    procedure wr_z_disk (forventet, læst);
    long forventet, læst;
    begin
      integer i;

      write (out, "nl", 1, true, 10, <:forventet:>,
        <<zd>, forventet shift (- 40) extract 8,
        ".", 1, <<zdddddddddd>, forventet shift 8 shift (- 8) // 512,
        ".", 1, <<zdd>, forventet shift 8 shift (- 8) mod 512);
      for i := 47 step - 1 until 0 do
      write (out, if forventet shift (- i) extract 1 = 1 then "1" else ".", 1,
        "sp", if i <> 40 then 0 else 1);

      write (out, "nl", 1, true, 10, <:læst:>,
        <<zd>, læst shift (- 40) extract 8,
        ".", 1, <<zdddddddddd>, læst shift 8 shift (- 8) // 512,
        ".", 1, <<zdd>, læst shift 8 shift (- 8) mod 512);
      for i := 47 step - 1 until 0 do
      write (out, if læst shift (- i) extract 1 = 1 then "1" else ".", 1,
        "sp", if i <> 40 then 0 else 1);

      if pause then system (10, 1, <:<10>pause pga fejl:>); <* pause *>

      if online then setposition (out, 0, 0);
    end procedure wr_z_disk;

    procedure wr_z_tape (forventet, læst);
    long forventet, læst;
    begin
      integer i;

      write (out, "nl", 1, true, 10, <:forventet:>,
        <<dd>, forventet shift (- 40) extract 8, ".", 1,
        <<dd>, forventet shift (- 32) extract 8, ".", 1,
        <<dd>, forventet shift (- 24) extract 8, ".", 1,
        <<d________>, forventet extract 24);
      for i := 47 step - 1 until 0 do
      write (out, if forventet shift (- i) extract 1 = 1 then "1" else ".", 1,
        "sp", if i mod 8 <> 0 or i < 24 then 0 else 1);

      write (out, "nl", 1, true, 10, <:læst:>,
        <<dd>, læst shift (- 40) extract 8, ".", 1,
        <<dd>, læst shift (- 32) extract 8, ".", 1,
        <<dd>, læst shift (- 24) extract 8, ".", 1,
        <<d________>, læst extract 24);
      for i := 47 step - 1 until 0 do
      write (out, if læst shift (- i) extract 1 = 1 then "1" else ".", 1,
        "sp", if i mod 8 <> 0 or i < 24 then 0 else 1);

      if pause then system (10, 1, <:<10>pause pga fejl:>); <* pause *>

      if online then setposition (out, 0, 0);
    end procedure wr_z_tape;
\f


    procedure test_tofrom (size);
    value size;
    integer size; <* bufferstørrelse pr buf i hw *>
    begin
      integer i, ejok;

      zone z0 (size // 4, 1, xstderror);
      zone z1 (size // 4, 1, xstderror);
      zone z2 (size // 4, 1, xstderror);
      zone z3 (size // 4, 1, xstderror);
      zone z4 (size // 4, 1, xstderror);
      zone z5 (size // 4, 1, xstderror);
      zone z6 (size // 4, 1, xstderror);
      zone z7 (size // 4, 1, xstderror);
      zone z8 (size // 4, 1, xstderror);
      zone z9 (size // 4, 1, xstderror);

      ejok := 0;
      size := size // 4; <* i dw *>

      for i := 1 step 1 until size do
      begin <* init med blok < 44 + lbnr < 4 + blok *>
        z0 (i) := real (extend 0 shift 44 + extend i shift 4 + 0);
        z1 (i) := real (extend 1 shift 44 + extend i shift 4 + 1);
        z2 (i) := real (extend 2 shift 44 + extend i shift 4 + 2);
        z3 (i) := real (extend 3 shift 44 + extend i shift 4 + 3);
        z4 (i) := real (extend 4 shift 44 + extend i shift 4 + 4);
        z5 (i) := real (extend 5 shift 44 + extend i shift 4 + 5);
        z6 (i) := real (extend 6 shift 44 + extend i shift 4 + 6);
        z7 (i) := real (extend 7 shift 44 + extend i shift 4 + 7);
        z8 (i) := real (extend 8 shift 44 + extend i shift 4 + 8);
        z9 (i) := real (extend 9 shift 44 + extend i shift 4 + 9);
      end;

      tofrom (z0, z1, size * 4);
      tofrom (z1, z2, size * 4);
      tofrom (z2, z3, size * 4);
      tofrom (z3, z4, size * 4);
      tofrom (z4, z5, size * 4);
      tofrom (z5, z6, size * 4);
      tofrom (z6, z7, size * 4);
      tofrom (z7, z8, size * 4);
      tofrom (z8, z9, size * 4);
      tofrom (z9, z0, size * 4);

      for i:= 1 step 1 until size do
      begin <* test *>
        if z0 (i) <> real (extend 1 shift 44 + extend i shift 4 + 1)
        or z1 (i) <> real (extend 2 shift 44 + extend i shift 4 + 2)
        or z2 (i) <> real (extend 3 shift 44 + extend i shift 4 + 3)
        or z3 (i) <> real (extend 4 shift 44 + extend i shift 4 + 4)
        or z4 (i) <> real (extend 5 shift 44 + extend i shift 4 + 5)
        or z5 (i) <> real (extend 6 shift 44 + extend i shift 4 + 6)
        or z6 (i) <> real (extend 7 shift 44 + extend i shift 4 + 7)
        or z7 (i) <> real (extend 8 shift 44 + extend i shift 4 + 8)
        or z8 (i) <> real (extend 9 shift 44 + extend i shift 4 + 9)
        or z9 (i) <> real (extend 1 shift 44 + extend i shift 4 + 1) then
        begin <* fejl *>
          ejok := ejok + 1;

          fejl (<:Fejl ved movecore, test no.:>, testno);
          write (out,
            "nl", 1, true, 16, <:forventet:>, true, 16, <:fundet:>, <:(blok.adr.blok):>,

            "nl", 1, <<zd>, 1, ".", 1, <<zddddddd>, i, ".", 1, <<zd>, 1,
            "sp", 2, <<zd>, z0 (i) shift (- 44) extract 4,
            ".", 1, <<zddddddd>, z0 (i) shift (- 4) extract 40,
            ".", 1, <<zd>, z0 (i) extract 4,

            "nl", 1, <<zd>, 2, ".", 1, <<zddddddd>, i, ".", 1, <<zd>, 2,
            "sp", 2, <<zd>, z1 (i) shift (- 44) extract 4,
            ".", 1, <<zddddddd>, z1 (i) shift (- 4) extract 40,
            ".", 1, <<zd>, z1 (i) extract 4,

            "nl", 1, <<zd>, 3, ".", 1, <<zddddddd>, i, ".", 1, <<zd>, 3,
            "sp", 2, <<zd>, z2 (i) shift (- 44) extract 4,
            ".", 1, <<zddddddd>, z2 (i) shift (- 4) extract 40,
            ".", 1, <<zd>, z2 (i) extract 4,

            "nl", 1, <<zd>, 4, ".", 1, <<zddddddd>, i, ".", 1, <<zd>, 4,
            "sp", 2, <<zd>, z3 (i) shift (- 44) extract 4,
            ".", 1, <<zddddddd>, z3 (i) shift (- 4) extract 40,
            ".", 1, <<zd>, z3 (i) extract 4,

            "nl", 1, <<zd>, 5, ".", 1, <<zddddddd>, i, ".", 1, <<zd>, 5,
            "sp", 2, <<zd>, z4 (i) shift (- 44) extract 4,
            ".", 1, <<zddddddd>, z4 (i) shift (- 4) extract 40,
            ".", 1, <<zd>, z4 (i) extract 4,

            "nl", 1, <<zd>, 6, ".", 1, <<zddddddd>, i, ".", 1, <<zd>, 6,
            "sp", 2, <<zd>, z5 (i) shift (- 44) extract 4,
            ".", 1, <<zddddddd>, z5 (i) shift (- 4) extract 40,
            ".", 1, <<zd>, z5 (i) extract 4,

            "nl", 1, <<zd>, 7, ".", 1, <<zddddddd>, i, ".", 1, <<zd>, 7,
            "sp", 2, <<zd>, z6 (i) shift (- 44) extract 4,
            ".", 1, <<zddddddd>, z6 (i) shift (- 4) extract 40,
            ".", 1, <<zd>, z6 (i) extract 4,

            "nl", 1, <<zd>, 8, ".", 1, <<zddddddd>, i, ".", 1, <<zd>, 8,
            "sp", 2, <<zd>, z7 (i) shift (- 44) extract 4,
            ".", 1, <<zddddddd>, z7 (i) shift (- 4) extract 40,
            ".", 1, <<zd>, z7 (i) extract 4,

            "nl", 1, <<zd>, 9, ".", 1, <<zddddddd>, i, ".", 1, <<zd>, 9,
            "sp", 2, <<zd>, z8 (i) shift (- 44) extract 4,
            ".", 1, <<zddddddd>, z8 (i) shift (- 4) extract 40,
            ".", 1, <<zd>, z8 (i) extract 4,

            "nl", 1, <<zd>, 1, ".", 1, <<zddddddd>, i, ".", 1, <<zd>, 1,
            "sp", 2, <<zd>, z9 (i) shift (- 44) extract 4,
            ".", 1, <<zddddddd>, z9 (i) shift (- 4) extract 40,
            ".", 1, <<zd>, z9 (i) extract 4);

          if online then setposition (out, 0, 0);

          if pause then system (10, 1, <:<10>pause pga fejl:>); <* pause *>
  
          if ejok >= stop then
          begin <* for mange fejl *>
            wr_test (<:for mange fejl observeret, testen stoppes:>, - 1);
            i := size;
          end for mange fejl;
        end fejl;
      end;
    end procedure test_tofrom;
\f


    integer procedure test_disk (funk, antbs, aktiviteter);
    integer funk, antbs, aktiviteter;
    begin
      <* funk = 1 => write seq, read cross og test data
         funk = 2 => write cross, read seq og test data
         funk = 3 => opret filer til diskcopy
         funk = 4 => diskcopy

         der laves io med maximal bufferlængde
         ved copy læses fra filerne wrksysxxxi og skrives i wrksysxxxo
         hvor xxx står for pågældende bsdeviceno

         retur antal fejl
      *>

      integer i, j, k, aktive, buf, nr, res, maxbuflgd;
      integer array ia (1 : 20);
      long array la (1 : 2);
      zone zhlp (1, 1, xstderror);

      procedure wseq (nr, name, disk, mk, sh, segm, buflgd, testnr);
      long array name, disk;
      integer nr, mk, sh, segm, buflgd, testnr;
      begin
        zone z (buflgd * 128 * sh, sh, xstderror);
        integer i, j, k;
        long l;
        long field lf;

        write (out, "nl", 1, <:write seq :>, disk,
          <<d>, <: segm.:>, segm, <: bloklgd.:>, buflgd);
        if online then setposition (out, 0, 0);

        xnulstil (z);
        open (z, mk, name, 1 shift 9);
        setposition (z, 0, 0);

        blok_lgd (nr) := buflgd;
        segment_nr (nr) := segm;
        aktivitet (nr) := 1;
        l := extend testnr shift 40;
        j := 0;
        for i := 1 step buflgd until segm do
        begin <* write seq *>
          if test then wr_test (<:før outrec6:>, i);
          outrec6 (z, buflgd * 512);

          for lf := 4 step if datacheck then 4 else 32 * 4 until buflgd * 512 do
          z.lf := l + extend j * 512 + lf;

          j := j + buflgd;
          segment_nr (nr) := segment_nr (nr) - buflgd;
        end;

        close (z, false);
      end procedure wseq;

      integer procedure rseq (nr, name, disk, mk, sh, segm, buflgd, testnr);
      long array name, disk;
      integer nr, mk, sh, segm, buflgd, testnr;
      begin
        zone z (buflgd * 128 * sh, sh, xstderror);
        integer i, j, k, ejok;
        long l;
        long field lf;

        write (out, "nl", 1, <:read  seq :>, disk,
          <<d>, <: segm.:>, segm, <: bloklgd.:>, buflgd);
        if online then setposition (out, 0, 0);

        open (z, mk, name, 1 shift 9);
        setposition (z, 0, 0);

        blok_lgd (nr) := buflgd;
        segment_nr (nr) := segm;
        aktivitet (nr) := 2;
        ejok := 0;
        l := extend testnr shift 40;
        j := 0;
        for i := 1 step buflgd until segm do
        begin <* read seq *>
          if test then wr_test (<:før inrec6:>, i);
          inrec6 (z, buflgd * 512);

          for lf := 4 step if datacheck then 4 else 32 * 4 until buflgd * 512 do
          if z.lf <> l + extend j * 512 + lf then
          begin <* fejl *>
            antal_fejl (nr) := antal_fejl (nr) + 1;
            ejok := ejok + 1;

            fejl (<:Fejl ved seq read:>, - 1);
            write (out, <<d>, <:læst på :>, disk,
              <: segment :>, j + (lf - 4) // 512,
              <: adr :>, (lf - 4) mod 512,
              "nl", 1, <: (disk.segm.hw / nr<40+adr):>);

            wr_z_disk (l + extend j * 512 + lf, z.lf);

            if ejok >= stop then
            begin <* for mange fejl *>
              wr_test (<:for mange fejl observeret, testen stoppes:>, - 1);
              i := segm;
              lf := buflgd * 512;
            end for mange fejl;
          end fejl;

          j := j + buflgd;
          segment_nr (nr) := segment_nr (nr) - buflgd;
        end;

        close (z, false);
        rseq := ejok;
      end procedure rseq;

      procedure wcross (nr, name, disk, mk, sh, segm, buflgd, testnr);
      long array name, disk;
      integer nr, mk, sh, segm, buflgd, testnr;
      begin
        zone z (buflgd * 128 * sh, sh, xstderror);
        integer i, j, k;
        boolean lav;
        long l;
        long field lf;

        write (out, "nl", 1, <:write cross :>, disk,
          <<d>, <: segm.:>, segm, <: bloklgd.:>, buflgd);
        if online then setposition (out, 0, 0);

        xnulstil (z);
        open (z, mk, name, 1 shift 9);
        setposition (z, 0, 0);

        blok_lgd (nr) := buflgd;
        segment_nr (nr) := segm;
        aktivitet (nr) := 3;
        lav := true;
        l := extend testnr shift 40;
        for i := 1 step buflgd until segm do
        begin <* write cross *>
          j := if lav then (i - 1) // 2 else segm - (i - 1 + buflgd) // 2;
          if test then wr_test (<:før setposition til segment:>, j);
          setposition (z, 0, j);

          if test then wr_test (<:før outrec6:>, i);
          outrec6 (z, buflgd * 512);

          lav := not lav;

          for lf := 4 step if datacheck then 4 else 32 * 4 until buflgd * 512 do
          z.lf := l + extend j * 512 + lf;

          segment_nr (nr) := segment_nr (nr) - buflgd;
        end;

        close (z, false);
      end procedure wcross;

      integer procedure rcross (nr, name, disk, mk, sh, segm, buflgd, testnr);
      long array name, disk;
      integer nr, mk, sh, segm, buflgd, testnr;
      begin
        zone z (buflgd * 128 * sh, sh, xstderror);
        integer i, j, k, ejok;
        boolean lav;
        long l;
        long field lf;

        write (out, "nl", 1, <:read  cross :>, disk,
          <<d>, <: segm.:>, segm, <: bloklgd.:>, buflgd);
        if online then setposition (out, 0, 0);

        open (z, mk, name, 1 shift 9);
        setposition (z, 0, 0);

        blok_lgd (nr) := buflgd;
        segment_nr (nr) := segm;
        aktivitet (nr) := 4;
        ejok := 0;
        lav := true;
        l := extend testnr shift 40;
        for i := 1 step buflgd until segm do
        begin <* read cross *>
          j := if lav then (i - 1) // 2 else segm - (i - 1 + buflgd) // 2;
          if test then wr_test (<:før setposition til segment:>, j);
          setposition (z, 0, j);

          if test then wr_test (<:før inrec6:>, i);
          inrec6 (z, buflgd * 512);

          lav := not lav;

          for lf := 4 step if datacheck then 4 else 32 * 4 until buflgd * 512 do
          if z.lf <> l + extend j * 512 + lf then
          begin <* fejl *>
            antal_fejl (nr) := antal_fejl (nr) + 1;
            ejok := ejok + 1;

            fejl (<:Fejl ved cross read:>, - 1);
            write (out, <<d>, <:læst på :>, disk,
              <: segment :>, j + (lf - 4) // 512,
              <: adr :>, (lf - 4) mod 512,
              "nl", 1, <: (disk.segm.hw / nr<40+adr):>);

            wr_z_disk (l + extend j * 512 + lf, z.lf);

            if ejok >= stop then
            begin <* for mange fejl *>
              wr_test (<:for mange fejl observeret, testen stoppes:>, - 1);
              i := segm;
              lf := buflgd * 512;
            end for mange fejl;
          end fejl;

          segment_nr (nr) := segment_nr (nr) - buflgd;
        end;

        close (z, false);
        rcross := ejok;
      end procedure rcross;

      procedure io_proc (nr, funk, buflgd, bsno);
      value nr, funk, buflgd, bsno;
      integer nr, funk, buflgd, bsno;
      begin
        <* funk som for hoved proceduren
           buflgd er antal segm i zonen
           bsno er den ønskede disks bsno

           der laves altid filer med et helt antal buffere
        *>

        integer ejok;

        ejok := 0;

        <* lav plads 2000 hw stack og til zonebuffer(e) *>
        xclaim (2000 + (if funk <> 5 then 1 else 2) * buflgd * 512);

        if funk >= 1 and funk <= 4 then
        begin
          boolean lav;
          integer i, j, k, segm;
          integer array tail (1 : 10);
          long array name, disk (1 : 2);
          zone z (1, 1, xstderror);

          makename (nr, name, 'i');
          open (z, 4, name, 1 shift 9);
          close (z, true);
          monitor (48, z, 0, tail); <* clear evt gammel fil *>

          makename (nr, name, 'o');
          open (z, 4, name, 1 shift 9);
          close (z, true);
          monitor (48, z, 0, tail); <* clear evt gammel fil *>

          segm := 0;
          xclaimproc (0, bsno, disk, 0, segm, i);
          if funk >= 3 then segm := segm // i // 2 * i; <* 2 hele filer *>
          if maxsegm > 0 and segm > maxsegm then segm := maxsegm; <* benyt parameter *>

          if segm > 0 and segm < buflgd then buflgd := segm
          else segm := segm // buflgd * buflgd; <* helt antal buffere *>

          tail (1) := segm;
          tofrom (tail.laf2, disk, 8);
          tail (6) := systime (7, 0, 0.0);
          tail (7) := tail (8) := tail (9) := 0;
          tail (10) := buflgd;

          if disk (1) = long <::> then <* ingen disk *>
          else
          if segm = 0 then <* ingen reso *>
          else
          case funk of
          begin
            begin <* 1 = write seq, read cross og test data *>
              makename (nr, name, 'i');
              open (z, 4, name, 1 shift 9);
              i := monitor (40, z, 0, tail); <* create entry *>
              if i <> 0 then segm := 0; <* kan ikke oprette filen *>

              wseq (nr, name, disk, 4, 1, segm, buflgd, nr);
              ejok := rcross (nr, name, disk, 4, 1, segm, buflgd, nr);

              if ejok = 0 then monitor (48, z, 0, tail) <* clear fil hvis ok *>
              else write (out, "nl", 1, <:pga. fejl slettes :>, name,
                <: på :>, disk, <: ikke:>);
              close (z, true);
            end 1;

            begin <* 2 = write cross, read seq og test data *>
              makename (nr, name, 'i');
              open (z, 4, name, 1 shift 9);
              i := monitor (40, z, 0, tail); <* create entry *>
              if i <> 0 then segm := 0; <* kan ikke oprette filen *>

              wcross (nr, name, disk, 4, 1, segm, buflgd, nr);
              ejok := rseq (nr, name, disk, 4, 1, segm, buflgd, nr);

              if ejok = 0 then monitor (48, z, 0, tail) <* clear fil hvis ok *>
              else write (out, "nl", 1, <:pga. fejl slettes :>, name,
                <: på :>, disk, <: ikke:>);
              if ejok = 0 then monitor (48, z, 0, tail) <* clear fil hvis ok *>
              else write (out, "nl", 1, <:pga. fejl slettes :>, name,
                <: på :>, disk, <: ikke:>);
              close (z, true);
            end 2;

            begin <* 3 = opret og check filer til diskcopy *>
              makename (nr, name, 'o');
              open (z, 4, name, 1 shift 9);
              i := monitor (40, z, 0, tail); <* create entry *>
              if i <> 0 then segm := 0; <* kan ikke oprette filen *>
              close (z, true);

              makename (nr, name, 'i');
              open (z, 4, name, 1 shift 9);
              i := monitor (40, z, 0, tail); <* create entry *>
              if i <> 0 then segm := 0; <* kan ikke oprette filen *>

              wseq (nr, name, disk, 4, 1, segm, buflgd, nr); <* skriv *>
              ejok := rseq (nr, name, disk, 4, 1, segm, buflgd, nr); <* checklæs *>
              if ejok <> 0 then antal_fejl (nr) := - (abs antal_fejl (nr)); <* død *>

              close (z, true);
            end 3;

            begin <* 4 = slet filer fra diskcopy *>
              makename (nr, name, 'o');
              open (z, 4, name, 1 shift 9);
              close (z, true);
              if antal_fejl (nr) = 0
              then monitor (48, z, 0, tail) <* clear fil hvis ok *>
              else write (out, "nl", 1, <:pga. fejl slettes :>, name, <: ikke:>);

              makename (nr, name, 'i');
              open (z, 4, name, 1 shift 9);
              close (z, true);
              monitor (48, z, 0, tail); <* slet fil *>
            end 4;
          end case;
        end funk 1..4
        else
        if funk = 5 then
        begin <* disk-disk-copy *>
          integer i, j, k, se, bu, segm_o, segm_i, nr_i;
          integer array tail_i, tail_o (1 : 10);
          long array name_i, name_o, disk_i, disk_o (1 : 2), la (1 : 5);
          zone z_i, z_o (1, 1, xstderror);

          makename (nr, name_o, 'o');
          open (z_o, 4, name_o, 1 shift 9);
          segm_o := if monitor (42, z_o, 0, tail_o) <> 0 then 0 else tail_o (1);
          tofrom (disk_o, tail_o.laf2, 8);

          if segm_o > 0 then <* det skal den være... *>
          for i := 1 step 1 until aktiviteter do
          begin <* kopier fra alle til mig *>
            nr_i := (nr - 1 + i) mod aktiviteter + 1; <* start ved disken efter mig *>

            makename (nr_i, name_i, 'i');
            open (z_i, 4, name_i, 1 shift 9);
            segm_i := if monitor (42, z_i, 0, tail_i) <> 0 then 0 else tail_i (1);
            tofrom (disk_i, tail_i.laf2, 8);

            if segm_i > 0 <* filen existerer *>
            and (xnameok (tail_i.laf2, disc1) <* første navnekrav ok *>
              or (xnameok (tail_i.laf2, disc2) and disc2 (1) <> long <::>)) <* andet navn ok *>
            then
            begin <* kopier *>
              trap (trap_copy);
              
              bu := buflgd;
              se := if segm_i >= segm_o then segm_o else segm_i;

              if se > 0 and se < bu then bu := se
              else se := se // bu * bu; <* helt antal buffere *>

              write (out, <<d>, "nl", 1,
                <:diskcopy :>, disk_i, <: -> :>, disk_o,
                <: segm.:>, se, <: bloklgd.:>, bu);
              if online then setposition (out, 0, 0);

              segment_nr (nr) := se;
              aktivitet (nr) := 5;
              xcopyzone (z_i, z_o, extend se * 512, bu * 512, 1);

              ejok := rseq (nr, name_o, disk_o, 4, 1, se, bu, nr_i);

              if false then
trap_copy:
              begin <* hertil trappes kun *>
                write (out, <<d>, "nl", 1,
                  <:Fejlet ved :>,
                  <:diskcopy :>, disk_i, <: -> :>, disk_o,
                  <: segm.:>, se, <: bloklgd.:>, bu);

                trap (nr); <* trap videre *>
              end trapped;
            end kopier;

            close (z_i, false);
          end pr bs;

          close (z_o, true);
        end funk 5;
      end procedure io_proc;

      procedure write_status (z);
      zone z;
      begin <* udskriv status for aktiviteter *>
        integer nr, i, j, k;
        long array la (1 : 2);
        real kl;
        integer array ia (1 : 20);
        zone zhlp (1, 1, xstderror);

        systime (5, 0, kl);

        writeint (z, "nl", 1, <:Aktivitetsstatus  kl. :>,
          <<zddd.dd>, round (kl),
          <: bufferinterval :>, <<d>, first_buf, ".", 2, last_buf,
          "nl", 1,
          <:aktivitet :>,
          <:disknavn    :>,
          <:   rørt:>,
          <:  antio:>,
          <: bloklgd:>,
          <: restseg:>,
          <:  fejl:>,
          <: waitbuf:>,
          <: status:>);

        for nr := 1 step 1 until aktiviteter do
        begin
          xclaimproc (0, bs_nr (nr), la, 0, 0, 0);
          systime (4, sidst_rørt (nr) / 10000, kl);
          system (12, nr, ia);

          writeint (z, "nl", 1,
            true, 10, case aktivitet (nr) + 1 of (
              <:tom:>, <:w.seq:>, <:r.seq:>, <:w.cross:>, <:r.cross:>, <:copy:>),
            true, 12, la,
            <<zddd.dd>, round (kl),
            <<bdddddd>, antal_io (nr),
            <<bddddddd>, blok_lgd (nr),
            <<bddddddd>, segment_nr (nr),
            <<-bdddd>, antal_fejl (nr),
            <<bddddddd>, ia (1),
            "sp", 1, (case ia (8) + 1 of
              (<:empty:>, <:expl pas:>, <:impl pas:>, <:activate:>)));
        end;

        write (z, "nl", 1, <:eventkø::>);
        j := 0;
        repeat
          i := monitor (66, zhlp, j, ia);
          if i = 0 then write (z, <:    mess:>) else
          if i > 0 then write (z, <<dddddddd>, j);
        until i < 0;

        write (z, "nl", 1);

        getzone6 (z, ia);
        if ia (1) <> 4 then setposition (z, 0, 0);
      end procedure write_status;
\f


      activity (aktiviteter); <* en activity pr faktisk disk *>

      system (5, 86, ia); <* first/last buf *>
      first_buf := ia (1);
      last_buf := ia (2);

      i := if funk < 3 then aktiviteter else aktiviteter * 2; <* hver copy bruger 2 buffere *>
      system (5, system (6, 0, la) + 26, ia); <* get buffer claim *>
      if ia (1) shift (- 12) < i
      then system (9, i - ia (1) shift (- 12), <:<10>bufsless:>);

      maxbuflgd := xmaxbuflgd (aktiviteter, aktiviteter * 4000, false) // 512;
      if funk = 5 then maxbuflgd := maxbuflgd // 2; <* copy bruger 2 gange *>
      if maxbuflgd < 1 then maxbuflgd := 1;
      if buflgd > 0 and maxbuflgd > buflgd
      then maxbuflgd := buflgd <* benyt parameter *>
      else
      if buflgd <= 0 and maxbuflgd > 100 then maxbuflgd := 100; <* max 100 seg *>

      buf := 0;
      for res := monitor (66, zhlp, buf, ia) while res <> - 1 do
      if res = 0 then
      begin <* fjern gamle messages *>
        monitor (20, zhlp, buf, ia); <* get message *>
        ia (9) := 2; <* rejected *>
        monitor (22, zhlp, buf, ia); <* send answer *>

        getzone6 (zhlp, ia);
        write (out, <<d>, "nl", 1, <:returner message fra :>, ia.laf2);
        if online then setposition (out, 0, 0);

        buf := 0; <* forfra *>
      end fjern message;

      aktive := nr := 0;
      for i := 0 step 1 until antbs - 1 do
      if (xclaimproc (0, i, la, 0, 0, j) and la (1) <> long <::>) <* disk ok *>
      and (xnameok (la, disc1) <* første navnekrav ok *>
        or (xnameok (la, disc2) and disc2 (1) <> long <::>)) <* andet navn ok *>
      then
      begin <* disken existerer og er ikke udmasket *>
        nr := nr + 1;

        if antal_fejl (nr) >= 0 then
        begin <* ikke nedgået *>
          systemtid (0, sidst_rørt (nr));
          bs_nr (nr) := i;

          aktive := aktive + 1;
          res := newactivity (nr, 0, io_proc, nr, funk, maxbuflgd, i) extract 24;
          if res > 0 then <* pasivated activity *> else
          if res = 0 then aktive := aktive - 1 <* afsluttet activity *>
          else
          begin <* fejl *>
            xwritealarm;
            if trapstop then system (9, nr, <:<10>stop...:>);

            fejl (<:activity terminated in errormode:>, res);
            antal_fejl (nr) := - (abs (antal_fejl (nr)) + 1); <* marker døden *>
            aktive := aktive - 1;

            if alarmcause extract 24 = - 9 <* break *>
            then goto trap_heltyt;
          end fejl;
        end ej nedgået;
      end disk ok;

      while aktive > 0 do
      begin <* reaktiver *>
        buf := 0;
        for res := w_activity (buf) while res < 0 do
        begin <* uventet buffer *>
          if test then write (out, <<d>, "nl", 1, <:w-activity=:>, res, <: buf.:>, buf);
        end uventet;

        if res = 0 then
        begin <* skriv status *>
          zone z (128, 1, xstderror);

          monitor (20, z, buf, ia); <* get message *>
          ia (9) := 2; <* rejected *>
          monitor (22, z, buf, ia); <* send answer *>

          getzone6 (z, ia);

          open (z, ia (1), ia.laf2, 0);
          write_status (z);
          close (z, false);
        end fjern message
        else
        begin <* answer *>
          nr := res;

          systemtid (0, sidst_rørt (nr));
          antal_io (nr) := antal_io (nr) + 1;

          if test then write (out, <<d>, "nl", 1, <:activate (:>, nr, <:) buf.:>, buf, "sp", 1);

          res := activate (nr) extract 24;
          if res > 0 then <* pasivated activity *> else
          if res = 0 then aktive := aktive - 1 <* afsluttet activity *>
          else
          begin <* fejl *>
            xwritealarm;
            if trapstop then system (9, nr, <:<10>stop...:>);

            fejl (<:activity terminated in errormode:>, res);
            antal_fejl (nr) := - (abs (antal_fejl (nr)) + 1); <* marker døden *>
            aktive := aktive - 1;

            if alarmcause extract 24 = - 9 <* break *>
            then goto trap_heltyt;
          end fejl;
        end answer;
      end while aktive > 0;

      j := 0;
      for i := 1 step 1 until aktiviteter do
      j := j + antal_fejl (i);

      test_disk := j;
    end procedure test_disk;

    message filen fortsættes;
▶EOF◀