!<arch>
simenvir.atr/   905612369   500   100   100644  3564      `
/*Cim_atr*/
SIMENVIR
 FILE simfile.atr

LNCTEXTOBJ* &0 0 0 0LBPCONSTANT ^__rtconstant 20 0
LIPSTART ^__rtstart 20 0
LIPLENGTH ^__rtlength 20 0
LTPMAIN ^__rtmain <0 0
LIPPOS ^__rtpos <0 0
LTPSETPOS ^__rtsetpos 20 0DIS*0 
LBPMORE ^__rtmore <0 0
LCPGETCHAR ^__rtgetchar <0 0
LTPPUTCHAR ^__rtputchar 20 0DCS*1 
LTPSUB ^__rtsub <0 0DIS*2 DIS*3 
LTPSTRIP ^__rtstrip <0 0
LIPGETINT ^__rtgetint <0 0
LRPGETREAL ^__rtgetreal <0 0
LIPGETFRAC ^__rtgetfrac <0 0
LTPPUTINT ^__rtputint 20 0DIS*4 
LTPPUTFIX ^__rtputfix 20 0DRS*5 DIS*6 
LTPPUTREAL ^__rtputreal 20 0DRS*7 DIS*8 
LTPPUTFRAC ^__rtputfrac 20 0DIS*9 DIS*10 

LIPMOD ^__rmod ;0 0DIS*11 DIS*12 
LIPREM ^__rrem ;0 0DIS*13 DIS*14 
LEPABS ^* ;0 0DES*15 
LRPABS*R ^__rabsr ;0 0DRS*16 
LIPABS*I ^__rabsi ;0 0DIS*17 
LIPSIGN ^* ;0 0DES*18 
LIPSIGN*R ^__rsignr ;0 0DRS*19 
LIPSIGN*I ^__rsigni ;0 0DIS*20 
LIPENTIER ^__rentier ;0 0DRS*21 
LRPADDEPSILON ^__raddepsilon ;0 0DRS*22 
LRPSUBEPSILON ^__rsubepsilon ;0 0DRS*23 
LTPCOPY ^__rcopy 10 0DTS*24 
LTPBLANKS ^__rblanks 10 0DIS*25 
LCPCHAR ^__rchar ;0 0DIS*26 
LCPISOCHAR ^__risochar ;0 0DIS*27 
LIPRANK ^__rrank ;0 0DCS*28 
LIPISORANK ^__risorank ;0 0DCS*29 
LBPDIGIT ^__rdigit ;0 0DCS*30 
LBPLETTER ^__rletter ;0 0DCS*31 
LCPLOWTEN ^__rlowten ;0 0DCS*32 
LCPDECIMALMARK ^__rdecimalmark ;0 0DCS*33 
LTPUPCASE ^__rupcase :0 0DTS*34 
LTPLOWCASE ^__rlowcase :0 0DTS*35 
LNCCOMMON* &0 0 0 0LNPDETACH ^__rdetach 40 0

LNPCALL ^__rcall 50 0DPS*36 COMMON* 
LNPRESUME ^__rresume 50 0DPS*37 COMMON* 
LNPEXCHANGE ^__rexchange 50 0DPS*38 COMMON* DPS*39 COMMON* 
LRPSQRT ^__rsqrt ;0 0DRS*40 
LRPSIN ^__rsin ;0 0DRS*41 
LRPCOS ^__rcos ;0 0DRS*42 
LRPTAN ^__rtan ;0 0DRS*43 
LRPCOTAN ^__rcotan ;0 0DRS*44 
LRPARCSIN ^__rarcsin ;0 0DRS*45 
LRPARCCOS ^__rarccos ;0 0DRS*46 
LRPARCTAN ^__rarctan ;0 0DRS*47 
LRPARCTAN2 ^__rarctan2 ;0 0DRS*48 DRS*49 
LRPSINH ^__rsinh ;0 0DRS*50 
LRPCOSH ^__rcosh ;0 0DRS*51 
LRPTANH ^__rtanh ;0 0DRS*52 
LRPLN ^__rln ;0 0DRS*53 
LRPLOG10 ^__rlog10 ;0 0DRS*54 
LRPEXP ^__rexp ;0 0DRS*55 
LEPMIN ^* ;0 0DES*56 DES*57 
LTPMIN*T ^__rmint ;0 0DTS*58 DTS*59 
LCPMIN*C ^__rminc ;0 0DCS*60 DCS*61 
LRPMIN*R ^__rminr ;0 0DRS*62 DRS*63 
LIPMIN*I ^__rmini ;0 0DIS*64 DIS*65 
LEPMAX ^* ;0 0DES*66 DES*67 
LTPMAX*T ^__rmaxt ;0 0DTS*68 DTS*69 
LCPMAX*C ^__rmaxc ;0 0DCS*70 DCS*71 
LRPMAX*R ^__rmaxr ;0 0DRS*72 DRS*73 
LIPMAX*I ^__rmaxi ;0 0DIS*74 DIS*75 
LIPSOURCELINE ^* ;0 0
CRSMAXLONGREAL 0 CRSMINLONGREAL 0 CRSMAXREAL 0 CRSMINREAL 0 CISMAXRANK 0 CISMAXINT 0 CISMININT 0 LTPSIMULAID ^__rsimulaid 10 0
LNPERROR ^__rterror ;0 0DTS*76 
LIPLOWERBOUND ^__rlowerbound ;0 0DAA*77 0DIS*78 
LIPUPPERBOUND ^__rupperbound ;0 0DAA*79 0DIS*80 
LBPDRAW ^__rdraw 70 0DRS*81 BIS*82 
LIPRANDINT ^__rrandint 70 0DIS*83 VIS*84 BIS*85 
LRPUNIFORM ^__runiform 70 0DRS*86 DRS*87 BIS*88 
LRPNORMAL ^__rnormal 70 0DRS*89 DRS*90 BIS*91 
LRPNEGEXP ^__rnegexp 70 0DRS*92 BIS*93 
LIPPOISSON ^__rpoisson 70 0DRS*94 BIS*95 
LRPERLANG ^__rerlang 70 0DRS*96 DRS*97 BIS*98 
LIPDISCRETE ^__rdiscrete 70 0DRA*99 0BIS*100 
LRPLINEAR ^__rlinear 70 0DRA*101 0DRA*102 0BIS*103 
LIPHISTD ^__rhistd 70 0DRA*104 0BIS*105 
LTPDATETIME ^__rdatetime 10 0
LRPCPUTIME ^__rcputime ;0 0
LRPCLOCKTIME ^__rclocktime ;0 0
LNPHISTO ^__rhisto ;0 0DRA*106 0DRA*107 0DRS*108 DRS*109 
LPPSYSIN !INFILE ^__rsysin ;0 0
LPPSYSOUT !PRINTFILE ^__rsysout ;0 0
LPPSYSERR !PRINTFILE ^__rsyserr ;0 0
LNPTERMINATE_PROGRAM ^__rterminate_program 60 0
&NCFILE FILE simfile.atr
LNPGBC ^__rgbc ;0 0
LIPARGC ^__rargc ;0 0
LIPARGV ^__rargv ;0 0
LNPDUMP ^__rdump 50 0VTS*161 
LNPUNDUMP ^__rundump 50 0VTS*162 
LNPRETURN ^__rreturn 50 0VIS*163 

simfile.atr/    905612369   500   100   100644  3955      `
/*Cim_atr*/
FILE

XNCFILE &0 0 1 1VTSfilename LISfile LCSopen LCSshared LCSappend LCScreate LCSreadwrite LCSre_wind LCSpurge LTPFILENAME ^__rfilename =0 0
LBPISOPEN ^__risopen 30 0
LBPSETACCESS ^__rsetaccess 30 0DTSv110 

XNCIMAGEFILE !FILE 0 0 2 4LTSIMAGE LPPSETPOS !IMAGEFILE ^__rsetpos 90 0DISv111 
LIPPOS ^__rpos 30 0
LBPMORE ^__rmore 30 0
LIPLENGTH ^__rlength 30 0

XNCOUTFILE !IMAGEFILE 0 0 3 7LBPOPEN ^__roopen 30 0DTSv112 
LBPCLOSE ^__roclose 30 0
LPPOUTIMAGE !OUTFILE ^__rooutimage 90 0
LPPOUTRECORD !OUTFILE ^__rooutrecord 90 0
LPPBREAKOUTIMAGE !OUTFILE ^__robreakoutimage 90 0
LBPCHECKPOINT ^__rdcheckpoint 30 0
LPPOUTCHAR !OUTFILE ^__rooutchar 90 0DCSv113 
LPPOUTTEXT !OUTFILE ^__roouttext 90 0DTSv114 
LPPOUTINT !OUTFILE ^__rooutint 90 0DISv115 DISv116 
LPPOUTFIX !OUTFILE ^__rooutfix 90 0DRSv117 DISv118 DISv119 
LPPOUTREAL !OUTFILE ^__rooutreal 90 0DRSv120 DISv121 DISv122 
LPPOUTFRAC !OUTFILE ^__rooutfrac 90 0DISv123 DISv124 DISv125 

XNCINFILE !IMAGEFILE 0 0 4 10LCSendfile LBPENDFILE ^__riendfile 30 0
LBPOPEN ^__riopen 30 0DTSv126 
LBPCLOSE ^__riclose 30 0
LPPINIMAGE !INFILE ^__riinimage 90 0
LBPINRECORD ^__riinrecord 30 0
LCPINCHAR ^__riinchar 30 0
LBPLASTITEM ^__rilastitem 30 0
LTPINTEXT ^__riintext =0 0DISv127 
LIPININT ^__riinint 30 0
LRPINREAL ^__riinreal 30 0
LIPINFRAC ^__riinfrac 30 0

XNCDIRECTFILE !IMAGEFILE 0 0 5 13LISloc LISmaxloc LISminwriteloc LISimagelength LCSendfile LCSlocked LCSlastop LCSwriteonly LIPLOCATION ^__rdlocation 30 0
LBPENDFILE ^__rdendfile 30 0
LBPLOCKED ^__rdlocked 30 0
LBPOPEN ^__rdopen 30 0DTSv128 
LBPCLOSE ^__rdclose 30 0
LIPLASTLOC ^__rdlastloc 30 0
LIPMAXLOC ^__rdmaxloc 30 0
LPPLOCATE !DIRECTFILE ^__rdlocate 90 0DISv129 
LPPINIMAGE !DIRECTFILE ^__rdinimage 90 0
LPPOUTIMAGE !DIRECTFILE ^__rdoutimage 90 0
LBPDELETEIMAGE ^__rddeleteimage 30 0
LIPLOCK ^__rdlock 30 0DRSv130 DISv131 DISv132 
LBPUNLOCK ^__rdunlock 30 0
LBPCHECKPOINT ^__rdcheckpoint 30 0
LBPLASTITEM ^__rilastitem 30 0
LCPINCHAR ^__riinchar 30 0
LTPINTEXT ^__riintext =0 0DISv133 
LIPININT ^__riinint 30 0
LRPINREAL ^__riinreal 30 0
LIPINFRAC ^__riinfrac 30 0
LPPOUTCHAR !DIRECTFILE ^__rooutchar 90 0DCSv134 
LPPOUTTEXT !DIRECTFILE ^__roouttext 90 0DTSv135 
LPPOUTINT !DIRECTFILE ^__rooutint 90 0DISv136 DISv137 
LPPOUTFIX !DIRECTFILE ^__rooutfix 90 0DRSv138 DISv139 DISv140 
LPPOUTREAL !DIRECTFILE ^__rooutreal 90 0DRSv141 DISv142 DISv143 
LPPOUTFRAC !DIRECTFILE ^__rooutfrac 90 0DISv144 DISv145 DISv146 

XNCPRINTFILE !OUTFILE 0 0 6 16LISline LISlines_per_page LISspacing LISpage LIPLINE ^__rpline 30 0
LIPPAGE ^__rppage 30 0
LBPOPEN ^__rpopen 30 0DTSv147 
LBPCLOSE ^__rpclose 30 0
LIPLINESPERPAGE ^__rplinesperpage 30 0DISv148 
LPPSPACING !PRINTFILE ^__rpspacing 90 0DISv149 
LPPEJECT !PRINTFILE ^__rpeject 90 0DISv150 
LPPOUTIMAGE !PRINTFILE ^__rpoutimage 90 0
LPPOUTRECORD !PRINTFILE ^__rpoutrecord 90 0

XNCBYTEFILE !FILE 0 0 7 19LCSendfile LCSbytesize LIPBYTESIZE ^__rbytesize 30 0

XNCINBYTEFILE !BYTEFILE 0 0 8 22LBPENDFILE ^__ribendfile 30 0
LBPOPEN ^__ribopen 30 0
LBPCLOSE ^__ribclose 30 0
LIPINBYTE ^__ribinbyte 30 0
LTPINTEXT ^__ribintext 30 0DTSv151 

XNCOUTBYTEFILE !BYTEFILE 0 0 9 25LBPOPEN ^__robopen 30 0
LBPCLOSE ^__robclose 30 0
LPPOUTBYTE !OUTBYTEFILE ^__roboutbyte 90 0DISv152 
LPPOUTTEXT !OUTBYTEFILE ^__robouttext 90 0DTSv153 
LBPCHECKPOINT ^__rdcheckpoint 30 0

XNCDIRECTBYTEFILE !BYTEFILE 0 0 10 28LISloc LISmaxloc LISminwriteloc LCSlocked LCSlastop LCSwriteonly LBPENDFILE ^__rdbendfile 30 0
LIPLOCATION ^__rdblocation 30 0
LIPMAXLOC ^__rdbmaxloc 30 0
LBPLOCKED ^__rdblocked 30 0
LBPOPEN ^__rdbopen 30 0
LBPCLOSE ^__rdbclose 30 0
LIPLASTLOC ^__rdblastloc 30 0
LPPLOCATE !DIRECTBYTEFILE ^__rdblocate 90 0DISv154 
LIPINBYTE ^__rdbinbyte 30 0
LPPOUTBYTE !DIRECTBYTEFILE ^__rdboutbyte 90 0DISv155 
LBPCHECKPOINT ^__rdcheckpoint 30 0
LIPLOCK ^__rdblock 30 0DRSv156 DISv157 DISv158 
LBPUNLOCK ^__rdbunlock 30 0
LTPINTEXT ^__rdbintext 30 0DTSv159 
LPPOUTTEXT !DIRECTBYTEFILE ^__rdbouttext 90 0DTSv160 



simset.sim/     905612369   500   100   100644  2965      `
% $Id: simset.sim,v 1.3 1997/02/14 16:33:02 cim Exp $

% Copyright (C) 1994 Sverre Hvammen Johansen,
% Department of Informatics, University of Oslo.
%
% This program is free software; you can redistribute it and/or modify
% it under the terms of the GNU General Public License as published by
% the Free Software Foundation; version 2.
%
% This program is distributed in the hope that it will be useful,
% but WITHOUT ANY WARRANTY; without even the implied warranty of
% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
% GNU General Public License for more details.
%
% You should have received a copy of the GNU General Public License
% along with this program; if not, write to the Free Software
% Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */

%ifdef included
%else
%timestamp simset
%endif
%nonetest off
%casesensitive on
CLASS SIMSET;
BEGIN

  CLASS LINKAGE;
  BEGIN REF(LINKAGE)zzsuc,zzpred;
  
    REF(LINK) PROCEDURE SUC;
      SUC:- IF zzsuc IN LINK THEN zzsuc ELSE NONE;
    
    REF(LINK) PROCEDURE PRED;
      PRED:- IF zzpred IN LINK THEN zzpred ELSE NONE;
    
    REF(LINKAGE) PROCEDURE PREV; PREV:-zzpred;
  
  END LINKAGE;
  

  LINKAGE CLASS LINK;
  BEGIN
  
    PROCEDURE OUT;
    IF zzsuc=/=NONE THEN BEGIN
      zzsuc.zzpred:-zzpred;
      zzpred.zzsuc:-zzsuc;
      zzsuc:-zzpred:-NONE;
    END OUT;
    
    PROCEDURE FOLLOW(PTR); REF(LINKAGE)PTR;
    BEGIN OUT;
      IF PTR=/=NONE AND THEN PTR.zzsuc=/=NONE THEN BEGIN
        zzpred:-PTR;
        zzsuc:-PTR.zzsuc;
        zzsuc.zzpred:-PTR.zzsuc:-THIS LINKAGE END
    END FOLLOW;
    
    PROCEDURE PRECEDE(PTR); REF(LINKAGE)PTR;
    BEGIN OUT;
      IF PTR=/=NONE AND THEN PTR.zzpred=/=NONE THEN BEGIN
        zzsuc:-PTR;
        zzpred:-PTR.zzpred;
        zzpred.zzsuc:-PTR.zzpred:-THIS LINKAGE END
    END PRECEDE;
    
    PROCEDURE INTO(S); REF(HEAD)S; PRECEDE(S);
  
  END LINK;
  

  LINKAGE CLASS HEAD;
  BEGIN
  
    REF(LINK) PROCEDURE FIRST;
      !FIRST:-SUC;
      FIRST:- IF zzsuc IN LINK THEN zzsuc ELSE NONE;  

    REF(LINK) PROCEDURE LAST; 
      !LAST:-PRED;
      LAST:- IF zzpred IN LINK THEN zzpred ELSE NONE;
    
    BOOLEAN PROCEDURE EMPTY; EMPTY:= zzsuc==THIS LINKAGE;
  
    INTEGER PROCEDURE CARDINAL;
    BEGIN INTEGER I;
      REF(LINKAGE) PTR;
%      PTR:-FIRST;
%      WHILE PTR =/= NONE DO BEGIN
%        I:=I+1;
%        PTR:-PTR.SUC;
%      END WHILE;
      PTR:-zzsuc;
      WHILE PTR =/= THIS LINKAGE DO BEGIN
        I:=I+1;
        PTR:-PTR.zzsuc;
      END WHILE;

      CARDINAL:=I
    END CARDINAL;
    
%    PROCEDURE CLEAR; WHILE FIRST=/= NONE DO FIRST.OUT;
    PROCEDURE CLEAR; 
    BEGIN
      REF(LINKAGE) PTR,PTRSUC;
      PTR:-zzsuc;
      WHILE PTR =/= THIS LINKAGE DO 
      BEGIN
        PTRSUC:-PTR.zzsuc;
        PTR.zzsuc:-PTR.zzpred:-NONE;
        PTR:-PTRSUC;
      END;
      zzsuc:-zzpred:-THIS LINKAGE
    END;
    
    zzsuc:-zzpred:-THIS LINKAGE
  END HEAD;

END SIMSET;

%CASESENSITIVE OFF
%eof

simulation.sim/ 905612369   500   100   100644  6309      `
% $Id: simulation.sim,v 1.4 1997/02/14 16:33:03 cim Exp $


% Copyright (C) 1994 Sverre Hvammen Johansen and Stein Krogdahl,
% Department of Informatics, University of Oslo.
%
% This program is free software; you can redistribute it and/or modify
% it under the terms of the GNU General Public License as published by
% the Free Software Foundation; version 2.
%
% This program is distributed in the hope that it will be useful,
% but WITHOUT ANY WARRANTY; without even the implied warranty of
% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
% GNU General Public License for more details.
%
% You should have received a copy of the GNU General Public License
% along with this program; if not, write to the Free Software
% Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */

%ifdef included
%else
%timestamp simulation
%endif
% nameasvar on
%nonetest off
%casesensitive on
SIMSET CLASS SIMULATION;
BEGIN
  REF(PROCESS) zzsqs;

  REF(zzmain_program)MAIN;
    
  REF(PROCESS) PROCEDURE CURRENT; CURRENT:-zzsqs.zzsqssuc;

  LONG REAL PROCEDURE TIME; TIME:=zzsqs.zzsqssuc.zzevtime;

  LINK CLASS PROCESS;
  BEGIN
    ! From event notice: ;
    REF(PROCESS) zzsqssuc, zzsqspred;
    LONG REAL zzevtime;
      
    ! From old process: ;
    BOOLEAN zzterminated_process;

    BOOLEAN PROCEDURE IDLE; IDLE:= (zzsqssuc==NONE);

    BOOLEAN PROCEDURE TERMINATED; TERMINATED:=zzterminated_process;
    
    LONG REAL PROCEDURE EVTIME;
      IF  zzsqssuc==NONE THEN ERROR("No Evtime for idle process")
      ELSE EVTIME:= zzevtime;
      
    REF(PROCESS) PROCEDURE NEXTEV;
      NEXTEV:-IF zzsqssuc==NONE OR ELSE zzsqssuc==zzsqs THEN NONE
        ELSE zzsqssuc;

    ! Not necessary: ;  zzsqssuc:- zzsqspred:- NONE;

    DETACH;
    INNER;
    zzterminated_process:=TRUE;

    ! Remove from SQS: ;
    zzsqssuc.zzsqspred:- zzsqspred;
    zzsqspred.zzsqssuc:- zzsqssuc;
    zzsqspred:- zzsqssuc:- NONE;

    IF zzsqs.zzsqssuc==zzsqs THEN ERROR("SQS: Empty")
                             ELSE RESUME(zzsqs.zzsqssuc);

    ERROR("SQS: Terminated process");
  END PROCESS;
  
  PROCEDURE activat(REAC,X,CODE,T,Y,PRIO);
    REF(PROCESS)X,Y;
    BOOLEAN REAC,PRIO;
    CHARACTER CODE;
    LONG REAL T;
  BEGIN
    REF(PROCESS) b, cur; 
    LONG REAL tm;

    IF X =/= NONE AND THEN NOT X.zzterminated_process
       AND THEN (REAC OR ELSE X.zzsqssuc == NONE) THEN
    BEGIN
      cur:- zzsqs.zzsqssuc; tm:=cur.zzevtime;

      IF CODE = '!1!' THEN
      BEGIN ! Direct ;
         IF X==cur THEN GOTO exit;
         T:=tm; b:- zzsqs;
      END ELSE
      IF CODE = '!2!' THEN
      BEGIN !At;
         IF T<=tm THEN
         BEGIN IF PRIO AND THEN X==cur THEN GOTO exit ELSE T:=tm END;
      END ELSE
      IF CODE = '!3!' THEN
      BEGIN !Delay;
         T:= T+tm;
         IF T<=tm THEN
         BEGIN IF PRIO AND THEN X==cur THEN GOTO exit ELSE T:=tm END;
      END ELSE
      ! CODE = '!4!' OR CODE = '!5!' ;
      BEGIN ! 4=Before, 5=After ;
         IF Y==NONE OR ELSE Y.zzsqssuc==NONE THEN
         BEGIN
            IF X.zzsqssuc=/=NONE THEN
            BEGIN
              X.zzsqssuc.zzsqspred:- X.zzsqspred;
              X.zzsqspred.zzsqssuc:- X.zzsqssuc;
              X.zzsqspred:- NONE; X.zzsqssuc:- NONE;
            END;

            IF zzsqs.zzsqssuc==zzsqs THEN ERROR("SQS: Empty");
            GOTO exit;
         END;

         IF X==Y THEN GOTO exit;

         T:= Y.zzevtime; 
         
         IF CODE = '!4!' THEN b:- Y.zzsqspred ELSE b:- Y;
       END;

       IF X.zzsqssuc =/= NONE THEN
       BEGIN
           X.zzsqssuc.zzsqspred:- X.zzsqspred;
           X.zzsqspred.zzsqssuc:- X.zzsqssuc;
       END;

       IF b==NONE THEN
       BEGIN ! Not `direct', `after' or `before' ;
          b:- zzsqs.zzsqspred;
          WHILE b.zzevtime>T DO b:- b.zzsqspred;
          IF PRIO THEN
            WHILE b.zzevtime=T DO b:- b.zzsqspred;
       END;

       X.zzevtime:= T;
       X.zzsqspred:- b; X.zzsqssuc:- b.zzsqssuc;
       b.zzsqssuc:- X; X.zzsqssuc.zzsqspred:- X;

       IF zzsqs.zzsqssuc=/=cur THEN RESUME(zzsqs.zzsqssuc);
    END;
  exit:
  END activat;

  PROCEDURE HOLD(t); 
    LONG REAL t;
  BEGIN
    REF(PROCESS) p,q; p:- zzsqs.zzsqssuc;
    IF t>0 THEN p.zzevtime:= p.zzevtime + t;
    t:= p.zzevtime;  ! New evtime ;
    IF p.zzsqssuc=/=zzsqs AND THEN p.zzsqssuc.zzevtime<=t THEN
    BEGIN
        p.zzsqssuc.zzsqspred:- p.zzsqspred;
        p.zzsqspred.zzsqssuc:- p.zzsqssuc;

        q:- zzsqs.zzsqspred;
        WHILE q.zzevtime>t DO q:- q.zzsqspred;

        p.zzsqspred:- q; p.zzsqssuc:- q.zzsqssuc;
        q.zzsqssuc:- p; p.zzsqssuc.zzsqspred:- p;

        RESUME(zzsqs.zzsqssuc);
    END IF;
  END HOLD;
  
  PROCEDURE PASSIVATE;
  BEGIN
     REF(PROCESS) p; p:- zzsqs.zzsqssuc;
     p.zzsqssuc.zzsqspred:- p.zzsqspred;
     p.zzsqspred.zzsqssuc:- p.zzsqssuc;
     p.zzsqspred:- NONE; p.zzsqssuc:- NONE;

     IF zzsqs.zzsqssuc==zzsqs THEN ERROR("SQS: Empty")
                              ELSE RESUME(zzsqs.zzsqssuc);
  END PASSIVATE;
  
  PROCEDURE WAIT(S);REF(HEAD)S;
  BEGIN
     REF(PROCESS) p; p:- zzsqs.zzsqssuc;
     p.INTO(S); ! May also be expanded inline ;

     p.zzsqssuc.zzsqspred:- p.zzsqspred;
     p.zzsqspred.zzsqssuc:- p.zzsqssuc;
     p.zzsqspred:- NONE; p.zzsqssuc:- NONE;

     IF zzsqs.zzsqssuc==zzsqs THEN ERROR("SQS: Empty")
                              ELSE RESUME(zzsqs.zzsqssuc);
  END WAIT;
  
  PROCEDURE CANCEL(x); REF(PROCESS)x;
  BEGIN
     REF(PROCESS) cur;
     IF x=/=NONE AND THEN x.zzsqssuc=/=NONE THEN
     BEGIN
        cur:- zzsqs.zzsqssuc;
        x.zzsqssuc.zzsqspred:- x.zzsqspred;
        x.zzsqspred.zzsqssuc:- x.zzsqssuc;
        x.zzsqspred:- NONE; x.zzsqssuc:- NONE;

        IF x==cur THEN
        BEGIN
           IF zzsqs.zzsqssuc==zzsqs THEN ERROR("SQS: Empty")
                                    ELSE RESUME(zzsqs.zzsqssuc);
        END;
     END;
  END CANCEL;
  
  PROCESS CLASS zzmain_program;
  BEGIN
    WHILE TRUE DO DETACH
  END MAIN_PROGRAM;

  PROCEDURE ACCUM(A,B,C,D);NAME A,B,C; 
    LONG REAL A,B,C,D;
  BEGIN
    A:=A+C*(TIME-B); B:=TIME; C:=C+D;
  END ACCUM;
    
  zzsqs:- NEW PROCESS; zzsqs.zzevtime:= -1;

  MAIN:- NEW zzmain_program;
  zzsqs.zzsqssuc:- MAIN; zzsqs.zzsqspred:- MAIN;
  MAIN.zzsqssuc:- zzsqs; MAIN.zzsqspred:- zzsqs;

END SIMULATION;

%CASESENSITIVE OFF
%eof

simset.atr/     949799728   500   100   100644  464       `
/*Cim_atr*/
SIMSET
 FILE simfile.atr
 SIMENVIR simenvir.atr

XNCSIMSET $0 0 206 2LNCLINKAGE $0 0 207 5LPSzzsuc LINKAGE LPSzzpred LINKAGE LPPSUC !LINK 208 8
LPPPRED !LINK 209 9
LPPPREV !LINKAGE 210 10

LNCLINK !LINKAGE 0 0 211 11LNPOUT $212 14
LNPFOLLOW $213 15DPSPTR LINKAGE 
LNPPRECEDE $214 16DPSPTR LINKAGE 
LNPINTO $215 17DPSS HEAD 

LNCHEAD !LINKAGE 0 0 216 18LPPFIRST !LINK 217 21
LPPLAST !LINK 218 22
LBPEMPTY $219 23
LIPCARDINAL $220 24
LNPCLEAR $221 25



simulation.atr/ 949799728   500   100   100644  660       `
/*Cim_atr*/
SIMULATION
 SIMSET simset.atr
 FILE simfile.atr
 SIMENVIR simenvir.atr

&NCSIMSET SIMSET simset.atr
XNCSIMULATION !SIMSET 0 0 222 2LPSzzsqs PROCESS LPSMAIN zzmain_program LPPCURRENT !PROCESS 223 5
LRPTIME $224 6
LNCPROCESS !LINK 0 0 225 7LPSzzsqssuc PROCESS LPSzzsqspred PROCESS LRSzzevtime LBSzzterminated_process LBPIDLE $226 10
LBPTERMINATED $227 11
LRPEVTIME $228 12
LPPNEXTEV !PROCESS 229 13

LNPactivat $230 14DBSREAC DPSX PROCESS DCSCODE DRST DPSY PROCESS DBSPRIO 
LNPHOLD $231 15DRSt 
LNPPASSIVATE $232 16
LNPWAIT $233 17DPSS HEAD 
LNPCANCEL $234 18DPSx PROCESS 
LNCzzmain_program !PROCESS 0 0 235 19
LNPACCUM $236 22NRSA NRSB NRSC DRSD 




syntax highlighted by Code2HTML, v. 0.9.1