|
DataMuseum.dkPresents historical artifacts from the history of: RC4000/8000/9000 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about RC4000/8000/9000 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 42240 (0xa500) Types: TextFile Names: »tsystest3 «
└─⟦9ccaf6601⟧ Bits:30008165 Bånd med SW8000 kildetekst/release værktøjer └─⟦f546e193b⟧ └─⟦this⟧ »tsystest3 «
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◀