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

⟦6f4a68732⟧ TextFile

    Length: 54528 (0xd500)
    Types: TextFile
    Names: »simulator«

Derivation

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

TextFile


begin
  simulation class ktassystem;
  comment
          ******************************************************
          *                                                    *
          * Simulator til et oplysningssystem ved KTAS.        *
          *                                                    *
          ****************************************************** ;
  begin
    process class center;
    begin
    end;
    \f


    center class inputproces;
    comment
            *****************************
            *                           *
            *  I N P U T   P R O C E S  *
            *                           *
            *****************************  ;
    begin
      comment
      ****************************************************
      *                                                  *
      * Simularer OP-systemets inputproces.Processen si- *
      * mulerer CPU-tidsforbrug ved analysebehandling af *
      * inddatalinier. Processen er implementerer ved en *
      * løkke, der gennemløber køen af ventende fore-    *
      * spørgsler. Hver forespørgsel tildeles tidskvan-  *
      * ter jvf. kvanttildelingsstrategien. Til sidst    *
      * aktiveres processtyring, til bestemmelse af næs- *
      * te procesbehandlingssted for forespørgslen.      *
      *                                                  *
      **************************************************** ;

      ref (job) aktualjob;real inputprocestid;
      while true do
      begin
        while not koe(1).empty do
        begin
          aktualjob :- koe(1).first;
          procaktiv(1):=true;
          if test=1 then spor(aktualjob.jobnr,1,1);
          inputprocestid:=inputtid;
          aktualjob.ankinput:=time;
          aktualjob.cpuinput:=inputprocestid;
          while inputprocestid > 0 do
          begin
            if inputprocestid < resttidskvant then
            begin
              hold(inputprocestid);
              inputsum(tid):=inputsum(tid)+inputprocestid;
              inputsum(5):=inputsum(5)+inputprocestid;
              timequantum(1):=timequantum(1)+inputprocestid;
              resttidskvant:=resttidskvant-inputprocestid;
              aktualjob.afginput:=time;
              overgang(aktualjob,inputprocesnr);
              if test= 1 then spor(aktualjob.jobnr,1,2);
              inputprocestid:=0;
            end else
            begin
              hold(resttidskvant);
              inputsum(tid):=inputsum(tid)+resttidskvant;
              inputsum(5):=inputsum(5)+resttidskvant;
              inputprocestid:=inputprocestid-resttidskvant;
              timequantum(1):=timequantum(1)+resttidskvant;
              activate skift after current;
              koeindsaet(1);
              resttidskvant:=tidskvant;
              passivate;
            end;
          end;
          if koe(1).empty then
          activate skift after current;
          procaktiv(1):=false;
        end;
        passivate;
      end;
    end;
    \f


    center class soegeproces;
    comment
            ****************************
            *                          *
            * S O E G E  P R O C E S   *
            *                          *
            **************************** ;
    begin
      comment
      *****************************************************
      *                                                   *
      * Simulerer OP-systemets søgeproces. Processen simu-*
      * lerer CPU-tidsforbrug ved afgrænsning af mulige   *
      * abonnenter ud fra givne kriterier. Processen er   *
      * implementeret efter samme princip som inputproces,*
      * dog deles tidsforbruget op i et antal lige store  *
      * tidsafsnit. Hvert tidsafsnit simuleres efterfulgt *
      * af en pladelagertilgang, idet diskkontrol aktive- *
      * res.                                              *
      *                                                   *
      ***************************************************** ;

      ref (job) soegejob;
      real soegeprocestid,delsoegeprocestid,husktid;
      integer pladelagertilgange;
      integer i;
      integer soegeprocnr;
      soegeprocnr:=soegeprocesnr;
      while true do
      begin
        while not koe(soegeprocnr).empty do
        begin
          soegejob:-koe(soegeprocnr).first;
          procaktiv(soegeprocnr):=true;
          if test=1 then spor(soegejob.jobnr,soegeprocnr,1);
          soegeprocestid := negexp(1/soegetid,startvaerdi);
          soegejob.anksoeg:=time;
          soegejob.cpusoeg:=soegeprocestid;
          pladelagertilgange:=
          randint(mindst,stoerst,startvaerdi)+1;
          delsoegeprocestid := soegeprocestid/pladelagertilgange;
          husktid := delsoegeprocestid;
          for i:=pladelagertilgange step -1 until 0 do
          begin
            while delsoegeprocestid > 0 do
            begin
              if delsoegeprocestid <= resttidskvant then
              begin
                if test = 1 then
                begin
                  if soegeprocnr = 2 then
                  outtext(" 1 ") else
                  outtext(" 2 ");
                  outtext("soege proces aktiv til tid ");
                  outfix(time,4,12);
                  outimage;
                end;
                hold(delsoegeprocestid);
                soegesum(tid):=soegesum(tid)+delsoegeprocestid;
                soegesum(5):=soegesum(5)+delsoegeprocestid;
                timequantum(soegeprocnr):=timequantum(soegeprocnr)+
                delsoegeprocestid;
                resttidskvant:=resttidskvant-delsoegeprocestid;
                delsoegeprocestid:=0;
                if i> 1 then
                activate skift after current;
              end else
              begin
                if test = 1 then
                begin
                  if soegeprocnr = 2 then
                  outtext(" 1 ") else
                  outtext(" 2 ");
                  outtext("proces soege aktiv til tid ");
                  outfix(time,4,12);
                  outimage;
                end;
                hold(resttidskvant);
                soegesum(tid):=soegesum(tid)+resttidskvant;
                soegesum(5):=soegesum(5)+resttidskvant;
                timequantum(soegeprocnr):=
                timequantum(soegeprocnr)+resttidskvant;
                delsoegeprocestid := delsoegeprocestid -
                resttidskvant;
                activate skift after current;
                koeindsaet(soegeprocnr);
                resttidskvant:=tidskvant;
                passivate;
              end;
            end;
            if i>1 then
            begin
              disknr:=soegeprocnr;
              diskkonnr:=1;
              activate kontrol(1) after current;
              pladelagertilgange := pladelagertilgange - 1;
              delsoegeprocestid := husktid;
              passivate;
            end;
          end;
          soegejob.afgsoeg:=time;
          overgang(soegejob,soegeprocnr);
          if test=1 then spor(soegejob.jobnr,soegeprocnr,2);
          if koe(soegeprocnr).empty then
          activate skift after current;
          procaktiv(soegeprocnr):=false;
        end;
        passivate;
      end;
    end;
    \f


    center class opslagproces;
    comment
            *******************************
            *                             *
            * O P S L A G S  P R O C E S  *
            *                             *
            ******************************* ;
    begin
      comment
      ******************************************************
      *                                                    *
      * Simulerer OP-systemets opslagsproces.Processen si- *
      * mulerer CPU-tidsforbruget ved egentlig opslag efter*
      * abonnenter. Processen er implementeret efter samme *
      * princip som søgeprocessen.                         *
      *                                                    *
      ****************************************************** ;

      ref (job) opslagjob;
      real opslagprocestid,delopslagprocestid,husktid;
      integer pladelagertilgange;
      integer i;
      while true do
      begin
        while not koe(3).empty do
        begin
          opslagjob :- koe(3).first;
          procaktiv(3):=true;
          if test = 1 then spor(opslagjob.jobnr,3,1);
          opslagprocestid := negexp(1/opslagtid,startvaerdi);
          opslagjob.ankopslag:=time;
          opslagjob.cpuopslag:=opslagprocestid;
          pladelagertilgange:=
          randint(faerrest,flest,startvaerdi)+1;
          delopslagprocestid := opslagprocestid/pladelagertilgange;
          husktid := delopslagprocestid;
          for i:=pladelagertilgange step -1 until 0 do
          begin
            while delopslagprocestid > 0 do
            begin
              if delopslagprocestid <= resttidskvant then
              begin
                hold(delopslagprocestid);
                opslagssum(tid):=opslagssum(tid)+delopslagprocestid;
                opslagssum(5):=opslagssum(5)+delopslagprocestid;
                timequantum(3):=timequantum(3)+delopslagprocestid;
                resttidskvant:=resttidskvant-delopslagprocestid;
                delopslagprocestid := 0;
                if i > 1 then
                activate skift after current;
              end else
              begin
                hold(resttidskvant);
                opslagssum(tid):=opslagssum(tid)+resttidskvant;
                opslagssum(5):=opslagssum(5)+resttidskvant;
                timequantum(3):=
                timequantum(3)+resttidskvant;
                delopslagprocestid := delopslagprocestid - resttidskvant;
                activate skift after current;
                koeindsaet(3);
                resttidskvant:=tidskvant;
                passivate;
              end;
            end;
            if i>1 then
            begin
              disknr:=opslagprocesnr;
              diskkonnr:=1;
              if kondublering then
              begin
                diskkonnr:=2;
                activate kontrol(2) after current
              end
              else
              activate kontrol(1) after current;
              pladelagertilgange := pladelagertilgange - 1;
              delopslagprocestid := husktid;
              passivate;
            end;
          end;
          opslagjob.afgopslag:=time;
          overgang(opslagjob,opslagprocesnr);
          if test = 1 then spor(opslagjob.jobnr,3,2);
          if koe(3).empty then
          activate skift after current;
          procaktiv(3):=false;
        end;
        passivate;
      end;
    end;
    \f


    center class outputproces;
    comment
            *****************************
            *                           *
            * O U T P U T  P R O C E S  *
            *                           *
            ***************************** ;
    begin
      comment
      *******************************************************
      *                                                     *
      * Simulerer OP-systemet outputproces. Processen simu- *
      * lerer CPU-tidsforbruget ved rediringsaktioner på in-*
      * formation modtaget fra de øvrige processer. Proces- *
      * sen er implementeret som inputproces, dog kan der   *
      * ske pladelagertilgang efter CPU-tidsforbruget.      *
      *                                                     *
      ******************************************************* ;
      ref (job) udjob;
      real outputprocestid,pladetilg;
      while true do
      begin
        while not koe(4).empty do
        begin
          udjob :- koe(4).first;
          procaktiv(4):=true;
          if test = 1 then spor(udjob.jobnr,4,1);
          outputprocestid:=outputtid;
          udjob.ankoutput:=time;
          udjob.cpuoutput:=outputprocestid;
          while outputprocestid > 0 do
          begin
            if outputprocestid < resttidskvant then
            begin
              hold(outputprocestid);
              outputsum(tid):=outputsum(tid)+outputprocestid;
              outputsum(5):=outputsum(5)+outputprocestid;
              timequantum(4):=timequantum(4)-
              outputprocestid;
              resttidskvant:=resttidskvant-outputprocestid;
              pladetilg:=uniform(0,1,startvaerdi);
              if pladetilg <= pladesands then
              begin
                disknr:=outputprocesnr;
                diskkonnr:=1;
                if kondublering then
                begin
                  diskkonnr:=2;
                  activate kontrol(2) after current
                end
                else
                activate kontrol(1) after current;
                passivate;
              end;
              udjob.afgoutput:=time;
              overgang(udjob,outputprocesnr);
              if test = 1 then spor(udjob.jobnr,4,2);
              outputprocestid := 0;
              activate proc(5);
              statkald:=5;
              activate proc(5);
            end else
            begin
              hold(resttidskvant);
              outputsum(tid):=outputsum(tid)+resttidskvant;
              outputsum(5):=outputsum(5)+resttidskvant;
              outputprocestid:=outputprocestid-resttidskvant;
              timequantum(4):=
              timequantum(4)+resttidskvant;
              activate skift after current;
              koeindsaet(4);
              resttidskvant:=tidskvant;
              passivate;
            end;
          end;
          if koe(4).empty then
          activate skift after current;
          procaktiv(4):=false;
        end;
        passivate;
      end;
    end;
    \f


    process class jobgenerator;
    comment
            *****************************
            *                           *
            *  J O B G E N E R A T O R  *
            *                           *
            ***************************** ;
    begin
      comment
      ******************************************************
      *                                                    *
      * Simulerer ankomst af forespørgsler til OP-systemet.*
      * Ankomsthyppigheden er beskrevet v.h.a. en tilfæl-  *
      * dighedsfordeling.                                  *
      *                                                    *
      ****************************************************** ;

      ref (job) jobgen;
      integer antaljob,tid;
      while true do
      begin
        antaljob := antaljob + 1;
        tid:=entier(time/3600000);
        hold(negexp(ankomstrate(tid),startvaerdi));
        jobgen :- new job;
        jobgen.jobnr := antaljob;
        if test = 1 then spor(jobgen.jobnr,7,1);
        jobgen.jobtid := time;
        koelengde(1);
        jobgen.into(koe(1));
        if not koe(1).cardinal > 1 then
        koeindsaet(1);
        if proc(1).idle and proc(2).idle
        and proc(3).idle and proc(4).idle
        and proc(6).idle then
        activate skift;
      end;
    end;
    \f


    process class diskkontrol;
    comment
            **************************
            *                        *
            * D I S K K O N T R O L  *
            *                        *
            ************************** ;
    begin
      comment
      *******************************************************
      *                                                     *
      * Simulerer styring af kommunikation mellem processer *
      * og pladelagre. Processen behandler 3 hovedtilfælde: *
      *  a) Enproces ønsker brug af pladelager.             *
      *  b) Et pladelager har foretaget positionering af ho-*
      *     vedet og ønsker tilladelse til overføring af    *
      *     data.                                           *
      *  c) En pladelageroverførsel er tilendebragt.        *
      *                                                     *
      ******************************************************* ;

      ref (soegeproces) check;
      ref(disk) kig;
      boolean kanalaktiv,soegecheck,speccheck;
      real kanalstart;
      integer konnr;
      while true do
      begin
        konnr:=diskkonnr;
        if test = 1 then
        begin
          outint(disknr,3);
          outtext("diskkontrol aktiv");
          outfix(time,4,12);
          outimage;
        end;
        if (not kontrolkald(konnr)) and
        (not paratkald(konnr)) then
        begin
          if disknr = 2 then
          proc(2).into(soegediskkoe);
          if disknr = 6 then
          begin
            disknr:=2;
            proc(6).into(soegediskkoe);
          end;
          if not kontrolkoe(konnr).empty then
          begin
            if disknr = 3 then
            proc(3).into(opslagsdiskkoe);
            if disknr = 4 then
            proc(4).into(outputdiskkoe);
          end else
          if not (disknr = 2 and soegediskkoe.cardinal = 2)
          then activate pladelager(disknr) after current;
        end
        else
        begin
          if kontrolkald(konnr) then
          begin
            if kontrolkoe(konnr).cardinal = 1 then
            activate kontrolkoe(konnr).first after current;
            kontrolkald(konnr):= false;
            if not kanalaktiv then
            begin
              kanalstart:=time;
              kanalaktiv:=true;
            end;
          end
          else
          begin
            if paratkald(1) and
            not soegediskkoe.empty
            and disknr=2 then
            begin
              check:-soegediskkoe.first;
              check.out;
              if dublering and not soegediskkoe.empty then
              begin
                speccheck:=true;
                if pladelager(disknr).idle then
                activate pladelager(disknr) after current;
              end;
              if check.soegeprocnr = 6  then
              soegecheck:=true;
            end;

            paratkald(konnr):=false;
            if soegecheck then
            begin
              soegecheck:=false;
              koeindsaet(6);
            end else
            koeindsaet(disknr);
            if not soegediskkoe.empty and not speccheck
            and pladelager(2).idle then
            begin
              speccheck:=true;
              activate pladelager(2) after current ;
            end else
            speccheck:=false;
            if not opslagsdiskkoe.empty then
            begin
              disknr:=3;
              activate pladelager(3) after current;
              opslagsdiskkoe.first.out;
            end;
            if not outputdiskkoe.empty then
            begin
              disknr:=4;
              activate pladelager(4)after current;
              outputdiskkoe.first.out;
            end;
            kig :- kontrolkoe(konnr).first;
            if (not kontrolkoe(konnr).empty
            and not speccheck) or
            (not kontrolkoe(konnr).empty and kig.kontrolnr <> 2) then
            activate kontrolkoe(konnr).first after current
            else speccheck:=false;
            if dublering and kontrolkoe(konnr).empty then
            begin
              if konnr = 1 then
              begin
                kanalaktiv := false;
                kanalsum(1,tid):=kanalsum(1,tid)+(time-kanalstart);
                kanalsum(1,5):=kanalsum(1,5)+(time-kanalstart);
              end
              else
              begin
                kanalaktiv:=false;
                kanalsum(2,tid):=kanalsum(2,tid)+(time-kanalstart);
                kanalsum(2,5):=kanalsum(2,5)+(time-kanalstart);
              end;
            end
            else
            begin
              if not dublering and kontrolkoe(konnr).empty then
              begin
                kanalaktiv:=false;
                kanalsum(konnr,tid):=kanalsum(konnr,tid)+(time-kanalstart);
                kanalsum(konnr,5):=kanalsum(konnr,5)+(time-kanalstart);
              end;
            end;
          end;
        end;
        passivate;
      end;
    end;
    \f


    process class disk;
    comment
            ************
            *          *
            * D I S K  *
            *          *
            ************ ;
    begin
      comment
      ********************************************************
      *                                                      *
      * Simulerer tidsforbruget ved pladelagertilgang. Opdelt*
      * i hhv. tidsforbruget ved positionering af hovedet og *
      * tidsforbruget ved overførsel af data.                *
      *                                                      *
      ******************************************************** ;

      integer kontrolnr;
      kontrolnr:=disknr;
      while true do
      begin
        if test = 1 then
        begin
          outint(kontrolnr,2);
          outtext("disk starter");
          outfix(time,4,12);
          outimage;
        end;
        disktilgange(kontrolnr):=disktilgange(kontrolnr)+1;
        disktid:=negexp(1/pladelagertid(kontrolnr),startvaerdi);
        hold(disktid);
        disksum(kontrolnr,tid):=disksum(kontrolnr,tid)+disktid;
        disksum(kontrolnr,5):=disksum(kontrolnr,5)+disktid;
        if kondublering then
        begin
          if kontrolnr = 2 then diskkonnr:=1
          else diskkonnr:=2;
        end else diskkonnr:=1;
        kanalkoe(diskkonnr);
        into(kontrolkoe(diskkonnr));
        kontrolkald(diskkonnr):=true;
        activate kontrol(diskkonnr) after current;
        disknr:=kontrolnr;
        passivate;
        hold(overfoerselstid);
        disksum(kontrolnr,tid):=
        disksum(kontrolnr,tid)+overfoerselstid;
        disksum(kontrolnr,5):=
        disksum(kontrolnr,5)+overfoerselstid;
        if kondublering and kontrolnr <> 2 then
        kanalkoe(2) else kanalkoe(1);
        out;
        disknr:=kontrolnr;
        if kondublering then
        begin
          if kontrolnr = 2 then diskkonnr:=1
          else diskkonnr:=2;
        end else diskkonnr:=1;
        paratkald(diskkonnr):=true;
        activate kontrol(diskkonnr) ;
        if test = 1 then
        begin
          outint(kontrolnr,2);
          outtext("disk faerdig");
          outfix(time,4,12);
          outimage;
        end;
        if proc(1).idle and proc(2).idle and
        proc(3).idle and proc(4).idle
        and proc(6).idle then
        activate skift after current;
        if not kontrolnr=2
        or ( kontrolnr = 2 and
        soegediskkoe.empty) then
        passivate;
      end;
    end;
    \f


    process class processtyring;
    comment
            ******************************
            *                            *
            * P R O C E S S T Y R I N G  *
            *                            *
            ****************************** ;
    begin
      comment
      ********************************************************
      *                                                      *
      * Simulerer aktivering af første proces i ventekø af   *
      * aktive processer. Desuden simuleres tidsforbruget ved*
      * skift mellem processer.                              *
      *                                                      *
      ******************************************************** ;

      ref (koeobjekt) aktivnu;
      integer n;
      while true do
      begin
        while not aktivkoe.empty do
        begin
          aktivnu:-aktivkoe.first;
          n:=aktivnu.aktivnr;
          aktivnu.out;
          if n = 6 then soegeprocesnr:=6
          else soegeprocesnr:=2;
          activate proc(n) delay skiftetid;
          antalprocskift:=antalprocskift+1;
          if resttidskvant > skiftetid then
          resttidskvant:=resttidskvant-skiftetid
          else
          resttidskvant:=
          (tidskvant+resttidskvant)-skiftetid;
          if test = 1 then
          begin
            outtext("processtyring aktiv ");
            outfix(time,4,12);
            outimage;
          end;
          processum(tid):=processum(tid)+skiftetid;
          processum(5):=processum(5)+skiftetid;
          passivate;
        end;
        if test = 1 and time>7800 and time <8000 then
        begin
          outtext("process styring passiv");
          outfix(time,4,12);
          outimage;
        end;
        passivate;
      end;
    end;
    \f


    process class koeobjekt;
    comment
            *********************
            *                   *
            * K O E O B J E K T *
            *                   *
            ********************* ;
    begin
      comment
      ****************************************************
      *                                                  *
      * Simulerer repræsentation af processer i ventekø  *
      * af aktive processer.                             *
      *                                                  *
      **************************************************** ;
      integer aktivnr,prioritet;
    end;
\f



    procedure koeindsaet(nummer);integer nummer;
    comment
            ***********************
            *                     *
            * K O E I N D S A E T *
            *                     *
            *********************** ;
    begin
      comment
      *****************************************************
      *                                                   *
      * Simulerer indsættelse af processer på rigtige sted*
      * i aktivkøen. Indplaceringen sker jvf. indsættel-  *
      * sesstrategien.                                    *
      *                                                   *
      ***************************************************** ;

      ref(koeobjekt) hjelp,hjelp1;
      integer n;
      n:=nummer;
      hjelp:-aktivkoe.first;
      while hjelp =/= none and hjelp.prioritet >
      objekt(n).prioritet do hjelp:-hjelp.suc;
      if timequantum(n) >= tidskvant then
      begin
        if hjelp == none then objekt(n).into(aktivkoe)
        else
        begin
          if hjelp.prioritet < objekt(n).prioritet then
          objekt(n).precede(hjelp)
          else
          begin
            hjelp1:-hjelp.suc;
            while hjelp.suc =/= none and hjelp1.prioritet =
            objekt(n).prioritet do
            begin
              hjelp:-hjelp.suc;
              hjelp1:-hjelp.suc;
            end;
          end;
          objekt(n).follow(hjelp);
        end;
        timequantum(n):=0;
        if test = 1 and time >7800 and time< 8000 then
        begin
          outtext("nummer 1 til tid ");
          outfix(time,4,12);
          outtext("aktivkoelengde ");
          outint(aktivkoe.cardinal,4);
          outimage;
        end;
      end else
      begin
        if aktivkoe.empty then
        begin
          objekt(n).into(aktivkoe);
          if test = 1 and time>7800 and time<8000 then
          begin
            outtext("nummer 2 til tid ");
            outfix(time,4,12);
            outtext("aktivkoelangde ");
            outint(aktivkoe.cardinal,4);
            outimage;
          end;
        end
        else
        begin
          if hjelp == none then objekt(n).into(aktivkoe)
          else
          objekt(n).precede(hjelp);
          if test = 1 and time >7800 and time<8000 then
          begin
            outtext("nummer 3 til tid ");
            outfix(time,4,12);
            outtext("aktivkoelengde ");
            outint(aktivkoe.cardinal,4);
            outimage;
          end;
        end;
      end;
    end;
    \f


    procedure koelengde(i);
    integer i;
    begin
      comment
              *************************
              *                       *
              * K O E L E N G D E     *
              *                       *
              *************************;
      comment
      ******************************************************
      *                                                    *
      * Beregner kontinuerligt længden af køen ved hver af *
      * de 4 processer (input,søge,opslags og output)      *
      *                                                    *
      ****************************************************** ;

      real korrtid;
      antalikoe(i,tid):=koe(i).cardinal;
      gnstikoe(i,5):=
      ((sidstmaalt(i)/time)*gnstikoe(i,5))
      +(((time-sidstmaalt(i))/time)*antalikoe(i,tid));
      sidstmaalt(i):=time;
      korrtid:=(time-(simtid*(tid-1)));
      if tid <> 5 then
      gnstikoe(i,tid):=
      ((sidstobs(i)/korrtid)*gnstikoe(i,tid))+
      (((korrtid-sidstobs(i))/korrtid)*antalikoe(i,tid));
      sidstobs(i):=korrtid;
    end;
    \f


    procedure kanalkoe(i);
    integer i;
    begin
      comment
              *************************
              *                       *
              * K A N A L K O E       *
              *                       *
              ************************* ;
      comment
      ******************************************************
      *                                                    *
      * Beregner kontinuerligt længden af køen ved dataka- *
      * nalen (diskkontrol).                               *
      *                                                    *
      ****************************************************** ;


      integer kanalkorr;
      kanalantal(i,tid):=kontrolkoe(i).cardinal;
      kanalgnst(i,5):=
      ((kanalsidst(i)/time)*kanalgnst(i,5))+
      (((time-kanalsidst(i))/time)*kanalantal(i,tid));
      kanalsidst(i):=time;
      kanalkorr:=(time-(simtid*(tid-1)));
      if tid <> 5 then
      kanalgnst(i,tid):=
      ((kanalobs(i)/kanalkorr)*kanalgnst(i,tid))+
      (((kanalkorr-kanalobs(i))/kanalkorr)*
      kanalantal(i,tid));
      kanalobs(i):=kanalkorr;

    end;
    \f


    procedure overgang(jobreference,procesnr);
    ref (job) jobreference;integer procesnr;
    begin
      ref (job) udtag;
      boolean snyd;
      comment
              ********************* 
              *                   *
              * O V E R G A N G   *
              *                   *
              ********************* ;
      comment
      ****************************************************
      *                                                  *
      * Bestemmer næste proces for en forespørgsel, givet*
      * den netop er færdig med en bestemt proces. Fast- *
      * læggelse sker v.h.a. en indlæst overgangsmatrice.*
      * Behandler yderligere implementering af en duble- *
      * ring af søgeprocessen.                           *
      *                                                  *
      **************************************************** ;
      integer procnr;
      real udtrukket;
      if test = 1 then
      begin
        outtext("overgang kaldt");
        outfix(time,4,12);
        outimage;
      end;
      udtrukket := uniform(0,1,startvaerdi);
      if procesnr = 6 then
      begin
        snyd:=true;
        procesnr:=2;
      end;
      procnr:=1;
      while procnr <= 5 and udtrukket >
      overgangsmatrix(procesnr,procnr) do
      procnr := procnr + 1;
      if snyd then
      begin
        procesnr:=6;
        snyd:=false;
      end;
      koelengde(procesnr);
      if dublering and procnr = 2
      and koe(6).empty and not koe(2).empty then
      procnr:=6;koelengde(procnr);
      if test= 2 and procesnr = 3 then
      begin
        outtext("koened til ");
        outint(koe(3).cardinal,3);
        outtext("jobnr - ");
        outint(jobreference.jobnr,3);
        outtext("time = ");
        outfix(time,4,12);
        outimage;
      end;
      if test = 2 and procnr = 3 then
      begin
        outtext("koeop til ");
        outint(koe(3).cardinal,3);
        outtext("jobnr =");
        outint(jobreference.jobnr,4);
        outtext("tid = ");
        outfix(time,4,12);
        outimage;
      end;
      jobreference.into(koe(procnr));
      if (procnr<5 or procnr = 6) and
      not procaktiv(procnr)
      and not koe(procnr).cardinal > 1 then
      koeindsaet(procnr);
      if dublering and procesnr = 6 and
      koe(6).empty and koe(2).cardinal > 1 then
      begin
        udtag:-koe(2).first.suc;
        koelengde(2);
        udtag.into(koe(6));
      end;
    end;
    \f


    process class job;
    comment
            **********
            *        *
            * J O B  *
            *        *
            ********** ;
    begin
      comment
      ****************************************************
      *                                                  *
      * Simulerer forekomsten af en forespørgsel i OP-   *
      * systemet.                                        *
      *                                                  *
      **************************************************** ;

      integer jobnr;
      real jobtid,ankinput,afginput,cpuinput,
      anksoeg,afgsoeg,cpusoeg,
      ankopslag,afgopslag,cpuopslag,
      ankoutput,afgoutput,cpuoutput;
    end;
    \f


    center class statistik;
    comment
            **********************
            *                    *
            * S T A T I S T I K  *
            *                    *
            ********************** ;
    begin
      comment
      ****************************************************
      *                                                  *
      * Beregningsprocedure af tidsforbruget ved de 4    *
      * processer, opdelt i CPU-tid, køtid og samlet tid.*
      *                                                  *
      **************************************************** ;

      ref (job) jobref;
      real hjelptid;
      integer pointer;
      real koetid,procestid;
      integer t;
      while true do
      begin
        if statkald = 5 then
        begin
          t:=5;
          statkald:=0;
        end else t:=tid;
        jobref:-koe(5).first;
        if test = 1 and t = 5 then
        spor(jobref.jobnr,5,1);
        antalforsp(1,t):=antalforsp(1,t)+1;
        procestid:=jobref.afginput-jobref.ankinput;
        koetid:=jobref.ankinput-jobref.jobtid;
        snitforsp(1,1,t):=snitforsp(1,1,t)+procestid;
        varforsp(1,1,t):=varforsp(1,1,t)+procestid*procestid;
        snitforsp(1,2,t):=snitforsp(1,2,t)+jobref.cpuinput;
        varforsp(1,2,t):=
        varforsp(1,2,t)+jobref.cpuinput*jobref.cpuinput;
        snitforsp(1,3,t):=
        snitforsp(1,3,t)+koetid;
        varforsp(1,3,t):=
        varforsp(1,3,t)+koetid*koetid;
        if jobref.cpusoeg > 0 then
        begin
          antalforsp(2,t):=antalforsp(2,t)+1;
          procestid:=jobref.afgsoeg-jobref.anksoeg;
          koetid:=jobref.anksoeg-jobref.afginput;
          snitforsp(2,1,t):=
          snitforsp(2,1,t)+procestid;
          varforsp(2,1,t):=
          varforsp(2,1,t)+procestid*procestid;
          snitforsp(2,2,t):=
          snitforsp(2,2,t)+jobref.cpusoeg;
          varforsp(2,2,t):=
          varforsp(2,2,t)+jobref.cpusoeg*jobref.cpusoeg;
          snitforsp(2,3,t):=
          snitforsp(2,3,t)+koetid;
          varforsp(2,3,t):=
          varforsp(2,3,t)+koetid*koetid;
        end;
        if jobref.cpuopslag > 0 then
        begin
          procestid:=jobref.afgopslag-jobref.ankopslag;
          if jobref.cpusoeg > 0 then
          koetid:=jobref.ankopslag-jobref.afgsoeg
          else
          koetid:=jobref.ankopslag-jobref.afginput;
          antalforsp(3,t):=antalforsp(3,t)+1;
          snitforsp(3,1,t):=
          snitforsp(3,1,t)+procestid;
          varforsp(3,1,t):=
          varforsp(3,1,t)+procestid*procestid;
          snitforsp(3,2,t):=
          snitforsp(3,2,t)+jobref.cpuopslag;
          varforsp(3,2,t):=
          varforsp(3,2,t)+jobref.cpuopslag*jobref.cpuopslag;
          snitforsp(3,3,t):=
          snitforsp(3,3,t)+koetid;
          varforsp(3,3,t):=
          varforsp(3,3,t)+koetid*koetid;
        end;
        if jobref.cpuoutput > 0 then
        begin
          procestid:=jobref.afgoutput-jobref.ankoutput;
          if jobref.cpuopslag > 0 then
          koetid:=jobref.ankoutput-jobref.afgopslag
          else
          begin
            if jobref.cpusoeg > 0 then
            koetid:=jobref.ankoutput-jobref.afgsoeg
            else
            koetid:=jobref.ankoutput-jobref.afginput;
            antalfejl(t):=antalfejl(t)+1;
          end;
          antalforsp(4,t):=antalforsp(4,t)+1;
          snitforsp(4,1,t):=
          snitforsp(4,1,t)+procestid;
          varforsp(4,1,t):=
          varforsp(4,1,t)+procestid*procestid;
          snitforsp(4,2,t):=
          snitforsp(4,2,t)+jobref.cpuoutput;
          varforsp(4,2,t):=
          varforsp(4,2,t)+jobref.cpuoutput*jobref.cpuoutput;
          snitforsp(4,3,t):=
          snitforsp(4,3,t)+koetid;
          varforsp(4,3,t):=
          varforsp(4,3,t)+koetid*koetid;
          totaltid(t):=totaltid(t)+
          (jobref.afgoutput-jobref.ankinput);
        end;
        samlettid(t):=samlettid(t)+
        (jobref.afgoutput-jobref.jobtid);
        if t=5 then
        begin
          hjelptid:=jobref.afgoutput-jobref.jobtid;
          pointer:= entier(hjelptid);
          pointer:= pointer // 250;
          if pointer > 32 then
          svarfordel(32):=svarfordel(32)+1
          else
          svarfordel(pointer):=svarfordel(pointer)+1;
          if minsvartid > hjelptid then
          minsvartid:=hjelptid;
          if maxsvartid < hjelptid then
          maxsvartid:=hjelptid;
          jobref.out;
        end;
        passivate;
      end;
    end;
    \f


    procedure skrivresultat(tid);
    integer tid;
    comment
            ******************************
            *                            *
            * S K R I V R E S U L T A T  *
            *                            *
            ****************************** ;
    begin
      comment
      ****************************************************
      *                                                  *
      * Udskrivningsprocedure af tællevariable, beregnede*
      * og afledte målevariable.                         *
      *                                                  *
      **************************************************** ;

      real procesudnyt,totaludnyt;
      real procent,accprocent;
      real procedure beregnsnit(l);integer l;
      if antalforsp(i,tid)>0 then
      beregnsnit:=snitforsp(i,l,tid)/antalforsp(i,tid);
      real procedure beregnvar(l);integer l;
      if antalforsp(i,tid)>0 then
      beregnvar:=varforsp(i,l,tid)/antalforsp(i,tid)-
      snit*snit;
      real snit;
      outimage;eject(1);
      for i:= 1 step 1 until 62 do outchar('*');
      outimage;outchar('*');
      for i:= 1 step 1 until 60 do outchar(' ');
      outchar('*');
      outimage;outchar('*');
      outtext("   R E S U L T A T E R   F R A   S I M U ");
      outtext("L A T O R E N      *");
      outimage;outchar('*');
      for i:= 1 step 1 until 60 do outchar(' ');
      outchar('*');outimage;
      for i:= 1 step 1 until 62 do outchar('*');
      outimage;
      if tid = 5 then
      outtext("Samlede resultater: ") else
      begin
        outtext("resultater for ");
        outint(tid,5);
        outtext(". kvarter");
      end;
      outimage;
      for i:= 1 step 1 until 4 do
      begin
        outimage;outimage;
        outimage;outimage;
        if i = 1 then
        outtext(" INPUT PROCES     ");
        if i = 2 then
        outtext(" SOEGE PROCES     ");
        if i = 3 then
        outtext(" OPSLAGS PROCES   ");
        if i = 4 then
        outtext (" OUTPUT PROCES    ");
        outimage;
        outtext(" ------------------");
        outimage;
        outimage;
        outtext(" antal forespoergsel = ");
        outint(antalforsp(i,tid),10);
        outimage;
        outtext(" gennemsnitlig procestid = ");
        snit:=beregnsnit(1);
        outfix(snit,2,8);
        outimage;
        outtext(" varianse på procestid   = ");
        outfix(beregnvar(1),2,12);
        outimage;
        outtext(" genenmsnitlig cputid    = ");
        snit:=beregnsnit(2);
        outfix(snit,2,8);
        outimage;
        outtext(" varianse på cputid      = ");
        outfix(beregnvar(2),2,12);
        outimage;
        outtext(" gennemsnitlig koetid    = ");
        snit:=beregnsnit(3);
        outfix(snit,2,8);
        outimage;
        outtext(" varianse på koetid      = ");
        outfix(beregnvar(3),2,12);
        outimage;
      end;
      outimage;outimage;
      outtext(" totaltid i systemet = ");
      outfix(totaltid(tid),2,12);
      outimage;outimage;
      outtext("Gennemsnitlig svartid med inputproces =");
      outfix(samlettid(tid)/antalforsp(1,tid),2,12);
      outimage;
      outtext("Gennemsnit svartid =");
      outfix(totaltid(tid)/antalforsp(1,tid),2,12);
      outimage;outimage;
      outtext(" antal fejl = ");
      outint(antalfejl(tid),8);
      outimage;outimage;
      outtext("Udnyttelsesgrad af inputproces=");
      procesudnyt:=(inputsum(tid)/simtid)*100;
      outfix(procesudnyt,2,7);
      totaludnyt:=procesudnyt;
      outimage;
      outtext("Udnyttelsesgrad af soegeproces =");
      procesudnyt:= (soegesum(tid)/simtid)*100;
      outfix(procesudnyt,2,7);
      totaludnyt:=totaludnyt+procesudnyt;
      outimage;
      outtext("Udnyttelsesgrad af opslagsproces =");
      procesudnyt:= (opslagssum(tid)/simtid)*100;
      outfix(procesudnyt,2,7);
      totaludnyt:=totaludnyt+procesudnyt;
      outimage;
      outtext("Udnyttelsesgrad af outputproces =");
      procesudnyt:= (outputsum(tid)/simtid)*100;
      outfix(procesudnyt,2,7);
      totaludnyt:=totaludnyt+procesudnyt;
      outimage;
      outtext("Udnyttelsesgrad af disk 1 =");
      procesudnyt:=(disksum(1,tid)/simtid)*100;
      outfix(procesudnyt,2,7);
      outimage;
      outtext("Udnyttelsesgrad af disk 2 =");
      procesudnyt:=(disksum(2,tid)/simtid)*100;
      outfix(procesudnyt,2,7);
      outimage;
      outtext("Udnyttelsesgrad af disk 3 =");
      procesudnyt:=(disksum(3,tid)/simtid)*100;
      outfix(procesudnyt,2,7);
      outimage;
      outtext("Udnyttelsesgrad af disk 4 =");
      procesudnyt:=(disksum(4,tid)/simtid)*100;
      outfix(procesudnyt,2,7);
      outimage;
      if not kondublering then
      begin
        outtext("udnyttelsesgrad af diskkanal =");
        procesudnyt:=(kanalsum(1,tid)/simtid)*100;
        outfix(procesudnyt,2,7);
        outimage;
      end
      else
      begin
        outtext("udnyttelsesgrad af diskkanal 1 =");
        procesudnyt:=(kanalsum(1,tid)/simtid)*100;
        outfix(procesudnyt,2,7);
        outimage;
        outtext("udnyttelsesgrad af diskkanal 2 =");
        procesudnyt:=(kanalsum(2,tid)/simtid)*100;
        outfix(procesudnyt,2,7);
        outimage;
      end;
      outtext("Belastning ved processkift =");
      procesudnyt:=(processum(tid)/simtid)*100;
      totaludnyt:=totaludnyt+procesudnyt;
      outfix(procesudnyt,2,7);
      outimage;
      outtext(" total udnyttelse af cpu = ");
      outfix(totaludnyt,2,7);
      outimage;
      outimage;
      outtext("Gennemsnit koeleengde for inputproces =");
      koelengde(1);
      outfix(gnstikoe(1,tid),3,5);
      outimage;
      if dublering then
      begin
        outtext("Gennemsnitlig koelengede for soegeproces 1 =");
        koelengde(2);
        outfix(gnstikoe(2,tid),3,5);
        outimage;
        outtext("Gennemsnitlig koelengde for soegeproces 2 =");
        koelengde(6);
        outfix(gnstikoe(6,tid),3,5);
        outimage;
      end
      else
      begin
        outtext("Gennemsnitlig koelengde for soegeproces =");
        koelengde(2);
        outfix(gnstikoe(2,tid),3,5);
        outimage;
      end;
      outtext("Gennemsnitlig koelengde for opslagsproces =");
      koelengde(3);
      outfix(gnstikoe(3,tid),3,5);
      outimage;
      outtext("Gennemsnitlig koelengde for outputproces=");
      outfix(gnstikoe(4,tid),3,5);
      koelengde(4);
      outimage;
      if kondublering then
      begin
        outtext("Gennemsnitlig koelengde for diskkanal 1=");
        kanalkoe(1);
        outfix(kanalgnst(1,tid),3,5);
        outimage;
        outtext("Gennemsnitlig koelengde for diskkanal 2=");
        outfix(kanalgnst(2,tid),3,5);
        kanalkoe(2);
        outimage;
      end
      else
      begin
        outtext("Gennemsnitlig koelengde for diskkanal =");
        kanalkoe(1);
        outfix(kanalgnst(1,tid),3,5);
        outimage;
      end;
      if tid = 5 then
      begin
        outimage;
        outtext("minimal svartid = ");
        outfix(minsvartid,2,10);
        outimage;
        outtext("maksimalsvartid = ");
        outfix(maxsvartid,2,10);
        outimage;
        outtext("antal processkift =");
        outint(antalprocskift,10);
        outimage;
        for i:= 1 step 1 until 4 do
        begin
          outtext(" antal pladelagertilgange ved disc");
          outint(i,3);outtext(" er =");
          outint(disktilgange(i),10);
          outimage;
        end;
        outimage;eject(1);
        outtext("svartidsfordeling:");
        outimage;
        outtext("------------------");outimage;
        outimage;
        outtext("svartid i ms   ");
        outtext(" antalforsp.   ");
        outtext(" procent af alle ");
        outtext("   acc.procent   ");
        outimage;
        for i:=1 step 1 until 60 do outchar('-');
        outimage;outimage;
        for i:=0 step 1 until 32 do
        begin
          outint(i*250,5);outtext(" - ");
          outint((((i+1)*250)-1),5);
          outtext("      ");
          outint(svarfordel(i),5);
          procent:= (svarfordel(i)/antalforsp(1,5))*100;
          accprocent:=accprocent+procent;
          outtext("      ");
          outfix(procent,2,7);
          outtext("      ");
          outfix(accprocent,2,7);
          outimage;
        end;
      end;

    end;
    \f


    procedure skrivinput;
    comment
            ************************
            *                      *
            * S K R I V I N P U T  *
            *                      *
            ************************ ;
    begin
      eject(1);
      outimage;
      for i:=1 step 1 until 62 do outchar('*');
      outimage;outchar('*');
      for i:=1 step 1 until 60 do outchar(' ');
      outchar('*');outimage;outchar('*');
      outtext("                I N P U T");
      outtext("                               ");
      outtext("    *");
      outimage;outchar('*');
      for i:= 1 step 1 until 60 do outchar(' ');
      outchar('*');outimage;
      for i:= 1 step 1 until 62 do outchar('*');
      outimage;outimage;outimage;
      outtext("antaljobs pr ms = ");
      outfix(ankomstrate(0),6,8);
      outimage;
      outimage;outimage;
      for i:=1 step 1 until 4 do
      begin
        outtext("pladetid");outchar('(');outint(i,2);
        outtext(") = ");outfix(pladelagertid(i),2,7);
        outimage;
      end;
      outtext("Overfoerselstid =");
      outfix(overfoerselstid,2,7);
      outimage;
      outimage;outimage;
      outtext("Minimale antal diskaccesser i soegeproces =");
      outint(mindst,5);
      outimage;
      outtext("Maksimale antal diskaccesser i soegeproces =");
      outint(stoerst,5);
      outimage;
      outtext("Minimale antal diskaccesser i opslagsproces =");
      outint(faerrest,5);
      outimage;
      outtext("Maksimale antal diskaccesser i opslagsproces =");
      outint(flest,5);
      outimage;
      outtext("Pladelager tilgangssandsynlighed i outputproces =");
      outfix(pladesands,2,5);
      outimage;
      outtext("GENNEMSNITLIG CPU-TID FOR : ");
      outimage;
      outtext("input proces    = ");outfix(inputtid,2,8);
      outimage;
      outtext("soege proces    = ");outfix(soegetid,2,8);
      outimage;
      outtext("opslags proces  = ");outfix(opslagtid,2,8);
      outimage;
      outtext("output proces   = ");outfix(outputtid,2,8);
      outimage;outimage;
      outtext("SKIFTETID = ");
      outfix(skiftetid,2,8);
      outimage;
      outtext("TIDSKVANT  = ");outfix(tidskvant,2,8);
      outimage;
      outtext("startvaerdi til tilfaeldighedstals  generator =");
      outint(startvaerdi,3);
      outimage;
      outtext("simperiode =");outint(simperiode,10);
      outimage;outtext("inputproces's prioritet =");
      outint(objekt(1).prioritet,4);
      outimage;outtext("soegeproces's prioritet=");
      outint(objekt(2).prioritet,4);
      outimage;outtext("opslagsproces's prioritet=");
      outint(objekt(3).prioritet,4);
      outimage;outtext("outputproces's prioritet=");
      outint(objekt(4).prioritet,4);
      outimage;
      outimage;eject(1);
      outimage;
      outtext(" OVERGANGS SANDSYNLIGHEDS MATRIX ");outimage;
      outtext(" ------------------------------- ");outimage;
      outimage;
      outtext("   i,   j   ");
      for i:=1 step 1 until 5 do
      begin
        outtext("    ");outint(i,2);outtext("    ");
      end;
      for i:=1 step 1 until 5 do
      begin
        outimage;
        outimage;
        outtext("    ");outint(i,2);outtext("    ");
        outtext("  ");
        outfix(overgangsmatrix(i,1),2,6);
        outtext("  ");
        for j:=2 step 1 until 5 do
        begin
          outtext("  ");
          outfix(overgangsmatrix(i,j)-overgangsmatrix(i,j-1),2,6);
          outtext("  ");
        end;
      end;
    end;
    \f


    procedure spor(nummer,procestype,status);
    integer nummer,procestype,status;
    begin
      outtext("jobnr ");
      outint(nummer,3);
      if status = 1 then
      outtext(" starter i ")  else
      outtext(" forlader ");
      if procestype = 1 then
      outtext("inputproces");
      if procestype = 2 then
      outtext("soegeproces 1");
      if procestype = 3 then
      outtext("opslagproces");
      if procestype = 4 then
      outtext("outputproces");
      if procestype = 5 then
      outtext("statistikproces");
      if procestype = 6 then
      outtext("soegeproces 2");
      if procestype = 7 then
      outtext("jobgenerator");
      outtext(" til tiden ");
      outfix(time,4,12);
      outimage;
    end;
\f


    comment
            *********************************
            *                               *
            * G L O B A L E  V A R A B L E  *
            *                               *
            ********************************* ;
    real array snitforsp,varforsp(1:6,1:3,1:5);
    integer array antalforsp(1:6,1:5);
    real array kanalsum(1:2,1:5);
    integer array antalfejl(1:5);
    real array totaltid,samlettid(1:5);
    real array disksum(1:4,1:5);
    real array soegesum(1:5);
    real array inputsum,opslagssum,outputsum,
    processum(1:5);
    real skiftetid;
    integer array svarfordel(0:32);
    real minsvartid,maxsvartid;
    integer antalprocskift;
    integer array disktilgange(1:5);
    boolean array kontrolkald(1:2);
    boolean array paratkald(1:2);
    integer diskkonnr,tid,simtid,statkald;
    boolean kondublering,dublering;
    real array sidstmaalt(1:6),kanalobs(1:2),
    kanalgnst(1:2,1:5),kanalsidst(1:2);
    integer array kanalantal(1:2,1:5);
    real overfoerselstid;
    real disktid;
    real pladesands;
    real resttidskvant;
    real array gnstikoe(1:6,1:5);
    real array sidstobs(1:6);
    real array timequantum(1:6);
    integer array antalikoe(1:6,1:5);
    real array overgangsmatrix(1:5,1:5),
    ankomstrate(0:23),
    pladelagertid(1:4);
    boolean array procaktiv(1:6);
    real inputtid,soegetid,opslagtid,outputtid,
    tidskvant;
    integer startvaerdi,kontrolnr,inputprocesnr,
    test,
    soegeprocesnr,opslagprocesnr,outputprocesnr,
    mindst,stoerst,faerrest,flest,disknr,i,j,simperiode;
    ref (head) array kontrolkoe(1:2);
    ref (disk) array pladelager(1:4);
    ref  (koeobjekt) array objekt(1:6);
    ref (center) array proc(1:6);
    ref (head) array koe(1:6);
    ref (head) aktivkoe;
    ref (head) soegediskkoe;
    ref (head) opslagsdiskkoe,outputdiskkoe;
    ref (processtyring) skift;
    ref (diskkontrol) array kontrol(1:2);
\f


    comment
            ************************************
            *                                  *
            * I N I T I A L I S E R I N G      *
            *                                  *
            ************************************ ;
    test:=inint;
    skiftetid:=inreal;
    for i:= 0 step 1 until 23 do ankomstrate(i) := inreal;
    for i:=1 step 1 until 4 do pladelagertid(i):=inreal;
    inputtid := inreal;
    soegetid:= inreal;
    opslagtid := inreal;
    outputtid := inreal;
    tidskvant := inreal;
    startvaerdi := inint;
    inputprocesnr := inint;
    soegeprocesnr:= inint;
    opslagprocesnr := inint;
    outputprocesnr := inint;
    mindst := inint;
    stoerst := inint;
    faerrest := inint;
    flest := inint;
    pladesands:=inreal;
    simperiode := inint;
    overfoerselstid:=inreal;
    i:=inint;
    if i = 1 then kondublering := true;
    i:=inint;
    if i = 1 then dublering:=true;
    for i:=1 step 1 until 6 do
    koe(i):- new head;
    for i:=1 step 1 until 2 do
    kontrolkoe(i):- new head;
    soegediskkoe:- new head;
    opslagsdiskkoe :- new head;
    outputdiskkoe :- new head;

    aktivkoe:- new head;
    proc(1) :- new inputproces;
    proc(2) :- new soegeproces;
    proc(3) :- new opslagproces;
    proc(4) :- new outputproces;
    proc(5) :- new statistik;
    proc(6):- new soegeproces;
    for i := 1 step 1 until 5 do
    begin
      overgangsmatrix(i,1) := 0;
      for j := 2 step 1 until 5 do
      overgangsmatrix(i,j) := inreal + overgangsmatrix(i,j-1);
    end;
    for i:=1 step 1 until 4 do
    pladelager(i) :- new disk;
    skift :- new processtyring;
    if kondublering then
    begin
      for i:=1 step 1 until 2 do kontrol(i):- new diskkontrol;
    end else kontrol(1):-new diskkontrol;
    for i:=1 step 1 until 6 do
    objekt(i):- new koeobjekt;
    for i:=1 step 1 until 6 do
    objekt(i).prioritet:=inint;
    resttidskvant:=tidskvant;
    for i:=1 step 1 until 6 do
    objekt(i).aktivnr:=i;
    skrivinput;
    minsvartid:=100000.0;
    activate new jobgenerator;
  end;
  ktassystem
  begin
    simtid:=simperiode/4;
    for tid :=1 step 1 until 4 do
    begin
      hold(simtid);
      skrivresultat(tid);
      for i:=1 step 1 until 6 do
      sidstobs(i):=0;
      for i:=1 step 1 until 2 do kanalobs(i):=0;
    end;
    simtid:=simperiode;
    skrivresultat(5);
  end;
end;
▶EOF◀