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 - download

⟦ee8382674⟧ TextFile

    Length: 5376 (0x1500)
    Types: TextFile
    Names: »slicestx    «

Derivation

└─⟦110021343⟧ Bits:30007476 RC8000 Backup tape fra HT's bus-radio system
    └─⟦a957ba283⟧ 
        └─ ⟦this⟧ »slicestx    « 

TextFile

message procedure slices side 1. hko,(ar) 790427;

integer procedure slices(doc,første_slice,slicenr,chainhead);
        value                første_slice;
        integer              første_slice;
        integer array    doc,             slicenr,chainhead;

<* proceduren returnerer sliceantal og slicenumre i en kæde
   i chaintabel hørende til dokumentet angivet i 'doc' og
   startende med et angivet slicenummer.

   desuden returneres indholdet af chainhead i særligt
   format.

   kald:        slices(doc,første_slice,slicenr,chainhead);

   slices       (retur, integer) >=0     ok. antal_slices i kæden.
                                             (0: fri slice)
                                 -2049 -,ok. illegalt dokumentnavn.
                                 -2048 -,ok. illegalt slicenummer.
                                 -2048< og <0  -,ok. -antal slices
                                         (slicenr for lille).

   doc          (kald,integer array) dokumentnavn i ord 1-4.

   første_slice (kald,integer) første slice i kæden, skal ligge
                mellem 0 og sidste slicenr i doc (positivt).

   slicenr      (retur, integer array) antal_slices elementer eller
                alle elementer indeholder slicenumre i kæden. 
                første element indeholder 'første_slice', hvis der en
                eller flere slices i kæden.
                overskydende elementer er nulstillede.

   chainhead    (retur,integer array) indeholder beskrivelse af
                'chaintable' og doc., hvis dokumentet eksisterer,
                ellers er samtlige elementer nulstillet.

                indhold af element nr:

                1     rel. adr. af 'chains' på dette dokument
                      i procesbeskrivelsen for interne processer.
                      ( altid <> 0 hvis dokumentet eksisterer).

                2     første 'slice' i hjælpekatalog.

                3     'bs-kind'. 0 == drum   1 == disc

                4     perm. nøgle ( == 'max-key').

                5-8   navn på hjælpekatalog.

                9     størrelse af hjælpekatalog.

                10-13 dokumentnavn.

                14    første 'slice' i 'chain table area'.

                15    slicelængde.

                16    sidste 'slice' på dokumentet.

                17    tilstand for dokument
                        1  'idle'
                        2  'after prepare'
                        4  'during insert'
                        8  'ready'
                       16  'during delete'
                       64  'during aux'

                18    cylinderlængde.

                19    1. ord i 'chaintable'.

                20    2. ord i 'chaintable'.

   fejlreaktioner:
     se ovenfor.

   kaldte procedurer:
     ingen.

*>
\f

message procedure slices side 2. hko 790301;

begin
  integer i,j,ngr,øgr,slnr,n,ø;
  real array ra(1:512);
  integer array ia,ib(1:20);
  boolean array field baf;

  ngr:=system(3,øgr,slicenr);
  for i:=ngr step 1 until øgr do slicenr(i):=0;
  baf:=1;
  slices:=-2049;

  system(5,92,ib);
  n:=system(3,ø,chainhead);
  for i:=n step 1 until ø do chainhead(i):=0;
\f

message procedure slices side 3. hko 790427;

  i:=ib(1)-2;
  for i:=i+2 while i<ib(3) do <* søg chaintable for doc *>
  begin
    integer array chadr(1:1);
    long array field laf,navn;
    integer docnr;

    system(5,i,chadr);
    system(5,chadr(1)-36,ia);
    docnr:=(i-ib(1)+2)//2;
    laf:=0;
    navn:=18;

    if doc.laf(1)=ia.navn(1) and doc.laf(2)= ia.navn(2) then
    begin
      j:=0;
      for j:=j+1 while j<=(ø-n+1) and j<=20 do
      begin
        integer akt;

        akt:= case j of ( 1,2,3,4,1, 1,1,1,1,1,
                          1,1,1,5,1, 2,2,6,1,1);
        case akt of
        begin
    <*1*> chainhead(n+j-1):=ia(j);
    <*2*> chainhead(n+j-1):=ia(j) shift (-12);
    <*3*> chainhead(n+j-1):=ia(j-1) extract 12 shift (-3);
    <*4*> chainhead(n+j-1):=ia(j-2) extract 3;
    <*5*> chainhead(n+j-1):=ia(j+2) extract 12;
    <*6*> chainhead(n+j-1):=( if docnr<4 then
                                (case docnr of ( 105,<* disc *>
                                                1000,<* disc1 *>
                                                  84 <* disc2 *>))
                              else 1000000);
        end;
      end;

      system(5,chadr(1)<*startadresse chaintable*>,ra);
      if første_slice<0 or første_slice>ia(16) shift (-12) then
        slices:=-2048
      else
      begin
        slnr:=første_slice;
        i:=0;
        if ra.baf(slnr) extract 12 <> 2048<* fri slice *> then
        repeat
          if ngr+i<=øgr then
            slicenr(ngr+i):=slnr;
          i:=i+1;
          j:=ra.baf(slnr) extract 12;
          if j>2047 then j:=j-4096;
          slnr:=slnr+j;
        until j=0;
        slices:=if i>øgr-ngr+1 then -i else i;
      end;
      i:=ib(3); <* afslut søgning efter chaintable *>
    end;
  end;
end slices;
▶EOF◀