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

⟦d471a0e3a⟧ TextFile

    Length: 72960 (0x11d00)
    Types: TextFile
    Names: »htattention «

Derivation

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

TextFile

attention.

attention venter på attention_message fra operatør_skærme og
io_skrivemaskine.
message fra operatør_skærme, der ikke er sat i drift (inkluderede)
afvises med result=4 'disconnected'

message fra andre processer afvises med result=2 'rejected'

message fra operatørskærme i drift og fra io_skrivemaskinen
besvares med result=1 'normal' og der hentes en operation fra
'cs_att_pulje' som sendes til den relevante hovedmodul_semafor,
der vidersender operationen til den relevante kommando_semafor.

efter endt brug skal operationen returneres til cs_att_pulje
v.hj.a. procedure afslut_kommando(operatør_nr,operation);

hver operatørskærm, garageterminal eller io_skrivemaskinen
kan kun have en attention operation under behandling ad gangen,
d.v.s. attention fra en terminal, der er "optaget", er uden virkning.

:1: attention: parameter erklæringer

message attention parametererklæringer side 1 - 810318/hko;

  integer
    att_op_længde,
    att_maske_lgd,
    terminal_beskr_længde;
  integer field
    terminal_tilstand,
    terminal_suppl;

:2: attention: parameter initialisering
\f

message attention parameterinitialisering side 1 - 810318/hko;

  att_op_længde:= 40;
  att_maske_lgd:=
     (1+max_antal_operatører+max_antal_garageterminaler+1+23)//24*2;
  terminal_beskr_længde:=6;
  terminal_tilstand:= 2;
  terminal_suppl:=4;

:3: attention: claiming
\f

message attention_claiming side 1 - 810318/hko;


    maxcoru:=maxcoru+1;

    max_op:=max_op +1
                   +max_antal_operatører
                   +max_antal_garageterminaler;

    max_nettoop:=maxnettoop+(data+att_op_længde)
                            *(1+max_antal_operatører
                               +max_antal_garageterminaler);

    max_procext:=max_procext+1;

    max_sem:= max_sem+1;

    max_semch:=maxsemch+1;


:4: attention: erklæringer
\f

message attention_erklæringer side 1 - 850820/cl;

  integer
    tf_kommandotabel,
    cs_att_pulje,
    bs_fortsæt_adgang,
    att_proc_ref;

  integer array
    att_flag,
    att_signal(1:att_maske_lgd//2);

  integer array
   terminal_tab(1:terminal_beskr_længde//2*(1<*io*>+
                        max_antal_operatører+max_antal_garageterminaler)),
   fortsæt(1:32);
\f

message procedure afslut_kommando side 1 - 810507/hko;

  procedure afslut_kommando(op_ref);
    integer array field     op_ref;
    begin integer nr,i,sem;
      i:= d.op_ref.kilde;
      nr:= if i=299 then max_antal_operatører+max_antal_garageterminaler+1
           else case i//100 of (0,i mod 100,max_antal_operatører+(i mod 100));
      sætbit_ia(att_flag,nr,0);
      d.op_ref.optype:=gen_optype;
<* "husket" attention disabled ****************
      if sætbit_ia(att_signal,nr,0)=1 then
      begin
        sem:=if i=299 then cs_talevejsswitch else
             case i//100 of (cs_io_komm,cs_operatør(i mod 100),
                             cs_garage(i mod 100));
        afslut_operation(op_ref,0);
        start_operation(op_ref,i,cs_att_pulje,0);
        signal_ch(sem,op_ref,gen_optype);
     end
     else
********************* disable "husket" attention *>
        afslut_operation(op_ref,cs_att_pulje);
    end;
\f

message procedure læs_store side 1 - 880919/cl;

integer procedure læs_store(z,c);
  zone                      z;
  integer                     c;
begin
  læs_store:= readchar(z,c);
  if 'a' <= c and c <= 'å' then c:= c - 'a' + 'A';
end;
\f

message procedure param side 1 - 810226/cl;



integer procedure param(txt,pos,spec,tabel_id,type,værdi,sep);
value tabel_id;
integer pos, tabel_id, type, sep;
integer array txt, spec, værdi;



       <*************************************>
       <*                                   *>
       <*   CLAUS LARSEN:  15.07.77         *>
       <*                                   *>
       <*************************************>




<*   param syntax-analyserer en parameterliste, og   *>
<*   bestemmer næste parameter og den separator der  *>
<*   afslutter parameteren                           *>



begin
   integer array klasse(0:127), aktuel_param(1:4), fdim(1:8);
   real array indgang(1:2);
   integer i, j, tegn, tegn_pos, tal, hashnøgle,
      zone_nr, top, max_segm, start_segm, lpos;
   boolean  minus, separator;
   lpos := pos;
   type:=-1;
   for i:=1 step 1 until 4 do værdi(i):=0;
\f

message procedure param side 2 - 810428/cl,hko;



   <* grænsecheck for pos *>
   begin
      integer nedre, øvre;

      nedre := system(3,øvre,txt);
      nedre := nedre * 3 - 2;
      øvre  := øvre  * 3;
      if lpos < (nedre - 1) or øvre < lpos then
      begin
        sep:= -1;
        param:= 5;
        goto slut;
      end;

      <* er parameterlisten slut *>
      lpos:= lpos+1;
      læs_tegn(txt,lpos,tegn);
      if tegn = 'em' or tegn = 'nl' or tegn = 'nul' then
      begin
         lpos := lpos - 2;
         sep := tegn;
         param := 5;

         goto slut;
      end else lpos:= lpos-1;
   end;
\f

message procedure param side 3 - 810428/cl;


   <* initialisering *>
   for i := 1 step 1 until 4 do
      aktuel_param(i) := 0;
   minus := separator := false;

   <* initialiser klassetabel *>
   for i := 65 step 1 until 93,
            97 step 1 until 125 do klasse(i) := 1;
   for i := 48 step 1 until 57 do klasse(i) := 2;
   for i := 0 step 1 until 47, 58 step 1 until 64, 
            94, 95, 96, 126, 127 do klasse(i) := 4;


   <* sæt specialtegn *>
   i := 1;
   læs_tegn(spec,i,tegn);
   while tegn <> 0 do
   begin
      if klasse(tegn) = 4 and tegn <> 'sp' and tegn <> 'nl' then
         klasse(tegn) := 3;
      læs_tegn(spec,i,tegn);
   end;
\f

message procedure param side 4 - 810226/cl;


   <* læs første tegn i ny parameter og bestem typen *>
   læs_tegn(txt,lpos,tegn);

   case klasse(tegn) of 
   begin

      <* case 1 - bogstav *>
      begin
         type := 0;
         param := 0;
         tegn_pos := 1;
         hashnøgle := 0;

         <* læs parameter *>
         while tegn_pos < 12 and klasse(tegn) <> 4 do
         begin
            hashnøgle := hashnøgle + tegn;
            skriv_tegn(aktuel_param,tegn_pos,tegn);
            læs_tegn(txt,lpos,tegn);
         end;

         <* find separator *>
         while klasse(tegn) <> 4 do læs_tegn(txt,lpos,tegn);
         sep := tegn;
\f

message procedure param side 5 - 810226/cl;

         <* tabelopslag *>
         if tabel_id <> 0 then
         begin
            <* hent max_segm *>

            fdim(4) := tabel_id;
            j := hent_fil_dim(fdim);
            if j > 0 then
            begin
               param := 4;
               for i := 1 step 1 until 4 do 
                  værdi(i) := aktuel_param(i);
               goto slut;
            end;
            max_segm := fdim(3);

            <* forbered opslag *>
            start_segm := (hashnøgle mod max_segm) + 1;
            indgang(1) := 0.0 shift 48 add aktuel_param(1)
               shift 24 add aktuel_param(2);
            indgang(2) := 0.0 shift 48 add aktuel_param(3)
               shift 24 add aktuel_param(4);
            hashnøgle := start_segm;
\f

message procedure param side 6 - 810226/cl;

            <* søg navn *>
            repeat
               <* læs segment *>
               læs_fil(tabel_id,hashnøgle,zone_nr);

               <* beregn sidste element *>
               top := fil(zone_nr,1) extract 24;
               top := (top - 1) * 4 + 2;

               <* søg *>
               for i := 2 step 4 until top do
                  if fil(zone_nr,i) = indgang(1) and
                     fil(zone_nr,i+1) = indgang(2) then
                  begin
                     <* fundet *>
                     værdi(1) := fil(zone_nr,i+2) shift (-24)
                                   extract 24;
                     værdi(2) := fil(zone_nr,i+2) extract 24;
                     værdi(3) := fil(zone_nr,i+3) shift (-24)
                                 extract 24;
                     værdi(4) := fil(zone_nr,i+3) extract 24;
                     goto fundet;
                  end;

               if top = 122 then <*overløb *>
                  hashnøgle := (hashnøgle mod max_segm) + 1;
            until top < 122 or hashnøgle = start_segm;

            <* navn findes ikke *>
            param := 2;
            for j := 1 step 1 until 4 do
               værdi(j) := aktuel_param(j);
fundet: ;
         end <*tabel_id <> 0 *>
         else
            for i := 1 step 1 until 4 do
               værdi(i) := aktuel_param(i);
      end <* case 1 *>;
\f

message procedure param side 7 - 810310/cl,hko;

      <* case 2 - ciffer *>
cif:  begin
           type:=tal := 0;
         while klasse(tegn) = 2 do
         begin
            type:=type+1;
            tal := tal * 10 + (tegn - 48);
            læs_tegn(txt,lpos,tegn);
         end;
         if minus then tal := -tal;
         værdi(1) := tal;
         sep := tegn;
         param := 0;
      end <* case 2 *>;
\f

message procedure param side 8 - 810428/cl;

      <* case 3 - specialtegn *>
spc:  begin
         if tegn = '-' then
         begin
            læs_tegn(txt,lpos,tegn);
            if klasse(tegn) = 2 then
            begin
               minus := true;
               goto cif;
            end
            else
            begin
               tegn := '-';
               lpos := lpos - 1;
            end;
         end;
         <* syntaxfejl *>
         param := if separator then 1 else 3;
         sep := tegn;
      end <* case 3 *>;

      <* case 4 - separator *>
      begin
         separator := true;
         goto spc;
      end <* case 4 *>;

   end <* case *>;

   lpos := lpos - 1;
slut: 
   pos := lpos;
end;
\f

message procedure læs_param_sæt side 1 - 830310/cl;

integer procedure læs_param_sæt(tekst,pos,ant,parm,term,res);
  integer array             tekst,        parm;
  integer                         pos,ant,     term,res;

<* proceduren læser et sammenhørende sæt parametre
   afsluttet med (sp),(nl),(;),(,) eller (nul)

   læs_param_sæt      returstatus eller 'typen' af det læste parametersæt
   (retur,int)
                     type ant  parm indeholder:
                     <0:   x  (ingenting) 'læs_param_sæt= nr på fejlkvit.'
                      0:   0  (ingenting) 'rest kommando er tom'
                      1:   1  (tekst)  'indtil 11 tegn'
                      2:   1  (pos.tal)
                      3:   1  (neg.tal)
                      4:   1  (pos.tal<1000)(bogstav) 'linienummer'
                      5:   1  G(pos.tal<100) 'gruppe_ident'
                      6:   2  (linie)/(løb) 'vogn_ident'
                      7:   3  (bus)/(linie)/(løb)
                      8:   3  (linie).(indeks):(løb)
                      9:   2  (linie).(indeks)
                     10:   2  (pos.tal).(pos.tal)
                     11: 2-3  G(pos.tal<100):(vogn) '(vogn)::=(bus)!(linie)/(løb)'
                     12:   3  D.(dato).(tid)

   tekst             indeholder teksten hvori parametersættet
   (kald,int.arr.)   skal søges.

   pos
   (kald/retur,int.)  position efter hvilken søgningen starter, og
                      ved retur positionen for afsluttende tegn.
                        (ikke ændret ved fejl)

   ant               hvis kaldeværdien er >0 skal parametersættet
   (kald/retur,int)  indeholde det angivne antal enkeltparametre,
                     i modsat fald returneres med fejltype -26
                     (skilletegn) eller -25 (parameter mangler).
                     ellers læses op til 3 enkeltparametre. retur-
                     værdien afhænger af det læste parametersæts 
                     type, se ovenfor under læs_param_sæt.
\f

message procedure læs_param_sæt side 2 - 810428/hko;

   parm              skal omfatte elementerne 1 til 4.
   (retur,int.arr.)  ved returstatus<=0 indeholder alle elemen-
                     terne værdien 0.

                     type (element,indhold)
                       1: 1-4,teksten
                     2-3: 1, talværdien
                       4: 1, tal shift 5 +tegnværdi (A=1,B=2,--,Å=29)
                       5: 1, talværdi (uden G)
                       6: 1, (som'4') shift 7 + løb
                       7: 1, bus
                          2, linie/løb som '6'
                       8: 1, tal shift 5 eller som '4'
                          2, tekst (1-3 bogstaver)
                          3, løb
                       9: 1 og 2, som '8'
                      10: 1, talværdi
                          2, talværdi
                      11: 1, som '5'
                          2, vogn (bus eller linie/løb)
                      12: 1, dato
                          2, tid

   term              iso-tegnværdien for tegnet der afslutter
   (retur,int)       parameter_sættet.

   res               som læs_param_sæt.
   (retur,int)

*>
\f

message procedure læs_param_sæt side 3 - 810310/hko;

  begin
    integer max_ant;

    max_ant:= 3;

    begin
      integer
        i,j,k,              <* hjælpe variable *>
        nr,                 <* nummer på parameter i sættet *>
        apos,               <* aktuel tegnposition *>
        cifre,             <* parametertype (param: 0=tekst, >1=tal) *>
        sep;                <* afsluttende skilletegn ved param *>

      integer array field
        iaf;                <* hjælpe variabel *>

      integer array
        par(1:4*max_ant),   <* 4 elementer for hver aktuel parameter *>
        s,                  <* 1 element med separator for hver parameter *>
        t(1:max_ant),       <* 1 element med typen for hver parameter *>
        værdi(1:4),         <* værdi af aktuel parameter jvf. param *>
        spec(1:1);          <* specialtegn i navne jvf. param *>

<*          de interne typer af enkeltparametre er

            type  parameter

              1:  1-3 tegn tekst (1 ord)
              2:  4-6 tegn       (2 ord)
              3:  7-9 tegn       (3 ord)
              4:10-11 tegn       (4 ord)
              5:  positivt heltal
              6:  negativt heltal
              7:  positivt heltal<1000 efterfulgt af stort bogstav
              8:  G efterfulgt af positivt heltal<100

*>
\f

message procedure læs_param_sæt side 4 - 810408/hko;

      nr:= 0;
      res:= -1;
      spec(1):= 0; <* ingen specialtegn *>
      apos:= pos;
      for i:= 1 step 1 until 4 do parm(i):= 0;
      for i:= 1 step 1 until max_ant do
      begin
        s(i):= t(i):= 0;
        for j:= 1 step 1 until 4 do par((i-1)*4+j):= 0;
      end;
      repeat
        <* skip foranstillede sp-tegn *>
        for i:= param(tekst,apos,spec,0<*intet tabelopslag*>,cifre,værdi,sep)
            while i=1 and sep='sp' do;
<*+2*>    
        begin
          if testbit25 and testbit26 then
          disable begin
            write(out,"nl",1,<:param (apos,cifre,sep):>,<< -dddd>,
                  i,apos,cifre,sep);
            laf:=0;
            if cifre<>0 then
               write(out,<:  værdi(1-4)::>,
                     << -dddd>,værdi(1),værdi(2),værdi(3),værdi(4))
            else write(out,<:  værdi::>,værdi.laf);
            ud;
          end;
        end;
<*-2*>
        ;
        if i<>0 then <* ikke ok *>
        begin
          if i=1 and (sep=',' or sep=';') then <* slut_tegn*>
          begin
            apos:= apos -1;
            res:= 0;
          end
          else if i=1 then res:=-26 <* skilletegn *>
          else <* i=5 *> res:= -25 <* parameter mangler *>
        end
        else <* i=0 *>
        begin
          if sep=',' or sep=';' then apos:=apos-1;
          iaf:= nr*8;
          nr:= nr +1;
\f

message procedure læs_param_sæt side 5 - 810520/hko/cl;

          if cifre=0 <* navne_parameter *> then
          begin
            if værdi(2)=0
               and læstegn(værdi,1,i)='G'
               and læstegn(værdi,2,j)>'0' and j<='9'
               and (læstegn(værdi,3,k)=0 or (k>='0' and k<='9'))
            then
            begin <* gruppenavn, repræsenteres som tal *>
              t(nr):= 8;
              j:= j -'0';
              par.iaf(1):= if k=0 then j else (j*10+(k-'0'));
              s(nr):= sep;
            end
            else
            begin <* generel tekst *>
              i:= 0;
              for i:= i +1 while i<=4 do
              begin
                if værdi(i)<>0 then
                begin
                  t(nr):= i;
                  par.iaf(i):= værdi(i);
                end
                else i:= 4;
              end;
              s(nr):= sep;
            end <* generel tekst *>
          end <* navne_parameter *>
          else
          begin <* talparameter *>
            i:= if værdi(1)<0 then 6 <* neg.tal *>
              else if værdi(1)>0 and værdi(1)<1000
                      and sep>='A' and sep<='Å' then 7
              else 5 <* positivt tal *>;
            t(nr):= i;
            par.iaf(1):= if i<>7 then værdi(1)
                         else værdi(1) shift 5 +(sep+1-'A');
            par.iaf(2):= cifre;
            apos:= apos+1;
            s(nr):= if i=7 then læstegn(tekst,apos,sep) else sep;
            apos:= apos-1;
          end;
        end;<* i=0 *>
      until (ant>0 and nr=ant)
            or nr=max_ant
            or res<> -1
            or sep='sp' or sep=';' or sep='em'
            or sep=',' or sep='nl' or sep='nul';
\f

message procedure læs_param_sæt side 6 - 810508/hko;

      if ant>nr then res:= -25 <*parameter mangler*>
      else
      if nr=0 or t(1)=0 then
      begin  <* ingen parameter før skilletegn *>
        if res=-25 then res:= 0;
      end
      else if sep<>'sp' and sep<>'nl' and sep <> 'em'
              and sep<>';' and sep<>',' then
      begin <* ulovligt afsluttende skilletegn *>
        res:= -26;
      end
      else
      begin <* en eller flere lovligt afsluttede parametre *>
        if t(1)<5 and nr=1 then

<* 1 navne_parameter *>

        begin
          res:= 1;
          tofrom(parm,par,8);
        end
        else if <*t(1)<9 and *> nr=1 then

<* 1 parameter af anden type *>

        begin <*tal,linie eller gruppe *>
          res:= t(1) -3;
          parm(1):= par(1);
        end
        else if t(1)=5 <* pos.tal *> or t(1)=7 <*linie*> then

<* mere end 1 parameter, hvoraf 1. er pos.tal eller linienr *>

        begin
          i:= par(1); <* lovlige parametre er alle repræsenteret i et ord *>
          j:= par(5); <* internt                                          *>
          k:= par(9); <*                                                  *>
          if nr=2 then
          <* 2 parametre i sættet *>
          begin
            res:= if (s(1)='/' or s(1)='.') and t(2)=5 <*pos.tal*> then 6
                  else if s(1)='.' and t(2)=1 then 9
                  else if s(1)='-' and t(1)=5 and t(2)=5 then 10
                  else if s(1)<>'/' and s(1)<>'.'
                                    and s(1)<>'-' then -26 <* skilletegn *>
                  else -27;<* parametertype*>
\f

message procedure læs_param_sæt side 7 - 810501/hko;

<* mere end 1 parameter, hvoraf 1. er pos.tal eller linienr *>

            <* 2 parametre i sættet *>
            if res=6 then
            begin
              if (i<1 or i>999) and t(1)=5 then
                res:= -5 <* ulovligt linienr *>
              else if (j<1 or j>99) then
                res:= -6 <* ulovligt løbsnr *>
              else
              begin
                if t(1)=5 then i:= i shift 5;
                parm(1):= i shift 7 +j;
              end;
            end <* res=6 *>
            else if res=9 then
            begin
              if t(1)=5 and (i<1 or 999<i) then
                res:= -5 <*ulovligt linienr*>
              else
              begin
                if t(1)=5 then i:=i shift 5;
                parm(1):= i;
                parm(2):= j;
              end;
            end <* res=9 *>
            else if res=10 then
            begin
              begin
                parm(1):= i;
                parm(2):= j;
              end;
            end; <* res=10 *>
          end <* nr=2 *>
          else
          if nr=3 then
          <* 3 paramtre i sættet *>
          begin
            res:= if (s(1)='/' or s(1)='.') and
                     (s(2)='/' or s(2)='.') then 7
                  else if s(1)='.' and s(2)=':' then 8
                  else -26; <* skilletegn *>
\f

message procedure læs_param_sæt side 8 - 810501/hko;

<* mere end 1 parameter, hvoraf 1. er pos.tal eller linienr *>
            <* 3 parametre i sættet *>
            if res=7 then
            begin
              if t(1)<>5 or (t(2)<>5 and t(2)<>7)
                 or t(3)<>5 then
                res:= -27 <* parametertype *>
              else
              if i<1 or i>9999 then res:= -7 <* ulovligt busnr *>
              else if t(2)=5 and (j<1 or j>999) then res:=-5 <* linie *>
              else if k<1 or k>99 then res:= -6 <* løb *>
              else
              begin <* ok *>
                parm(1):= i;
                if t(2)=5 then j:= j shift 5;
                parm(2):= j shift 7 +k;
              end;
            end
            else if res=8 then
            begin
              if t(2)<>1 or t(3)<>5 then res:= -27
              else if t(1)=5 and (i<1 or i>999) then res:= -5
              else if k<1 or k>99 then res:= -6
              else
              begin
                if t(1)=5 then i:= i shift 5;
                parm(1):= i;
                parm(2):= j;
                parm(3):= k;
              end;
            end;
          end <* nr=3 *>
          else res:=-24; <* syntaks *>
\f

message procedure læs_param_sæt side 9 - 810428/hko;

        end <* mere end 1 parameter,hvoraf 1. er pos.tal eller linienr *>
        else if t(1)=8 <* gruppe_id *> then
        begin
<* mere end 1 parameter , hvoraf den første
   er en gruppe_identifikation ved navn.
   lovlige parametre er alle internt repræsenteret i et ord *>

          i:=par(1);
          j:=par(5);
          k:=par(9);

          if nr=2 then
          <* 2 parametre *>
          begin
            res:=if s(1)=':' and t(2)=5 then 11
                 else if s(1)<>':' then -26 <* skilletegn *>
                 else -27; <*param.type *>
            if res=11 then
            begin
              if j<1 or j>9999 then res:=-7 <* ulovligt busnr *>
              else
              begin
                parm(1):=i;
                parm(2):=j;
              end;
            end;
\f

message procedure læs_param_sæt side 10 - 810428/hko;

<* mere end 1 parameter, hvoraf 1. er en gruppeidentifikation ved navn *>

          end <*nr=2*>
          else if nr=3 then
          <* 3 parametre *>
          begin
            res:=if s(1)=':' and s(2)='/' then 11
                 else -26; <* skilletegn *>
            if res=11 then
            begin
              if (t(2)<>5 and t(2)<>7) or t(3)<>5 then res:=-27 <*param.type*>
              else
              begin
                if t(2)=5 and (j<1 or j>999) then res:=-5 <* linie *>
                else
                begin
                  parm(1):=i;
                  if t(2)=5 then j:=j shift 5;
                  parm(2):= 1 shift 22 +j shift 7 +k;
                end;
              end;
            end;
          end <* nr=3 *>
          else res:=-24; <* syntaks *>
\f

message procedure læs_param_sæt side 11 - 810501/hko;

        end <* t(1)=8 *>
        else if t(1)=1 and par(1)= 'D' shift 16 then
        begin
<* mere end 1 parameter i sættet og 1. parameter er et 'D'.
             lovlige parametre er alle internt repræsenteret i et ord. *>
          i:=par(1);
          j:=par(5);
          k:=par(9);

          if nr=3 then
          begin
            res:=if s(1)='.' and s(2)='.' then 12
                 else -26; <* skilletegn *>
            if res=12 then
            begin
              if t(2)<>5 or t(3)<>5 then res:=-27 <* param. type *>
              else
              begin
                integer år,md,dg,tt,mm,ss;
                real dato,tid;
                år:=j//10000;
                md:=(j//100) mod 100;
                dg:=j mod 100;
                cifre:= par(10);
                tt:=if cifre>4 then k//10000 else if cifre>2 then k//100
                       else k;
                mm:=if cifre>4 then (k//100) mod 100
                       else if cifre>2 then k mod 100 else 0;
                ss:=if cifre>4 then k mod 100 else 0;
\f

message procedure læs_param_sæt side 12 - 810501/hko;

                dato:=systime(5,0.0,tid);
                if j=0 then dg:=round dato mod 100;
                if år=0 and md=0 then md:=(round dato//100) mod 100;
                if år=0 then år:=round dato//10000;
                if år>99 or md<1 or md>12 or tt>23 or mm>59 or ss>59 then
                  res:=-24 <* syntaks *>
                else if dg<1 or dg > (case md of (
                       31,(if år mod 4=0 then 29 else 28),31, 30,31,30,
                       31,31,30, 31,30,31)) then res:=-24
                else
                begin
                  parm(1):=år*10000+md*100+dg;
                  parm(2):=tt*10000+mm*100+ss;
                end;
              end;

            end; <* res=12 *>
          end <* nr=3 *>
          else res:=-24; <*syntaks*>
        end <* t(1)=1 and par(1)='D' shift 16 *>

        else res:=-27;<*parametertype*>
      end; <* en eller flere parametre *>

      læs_param_sæt:= res;
      term:= sep;
      if res>= 0 then pos:= apos;
    end;
  end læs_param_sæt;
\f

message procedure læs_kommando side 1 - 810428/hko;

integer procedure læs_kommando(z,kilde,op_ref,pos,indeks,sep,slut_tegn);
  value                           kilde;
  zone                          z;
  integer                         kilde,       pos,indeks,sep,slut_tegn;
  integer array field                   op_ref;

<* proceduren indlæser er kommmando fra en terminal (telex,
   skærm eller skrivemaskine). ved indlæsning fra skærm eller
   skrivemaskine inviteres først ved udskrivning af '>'-tegn.
   for terminalers vedkommendeslettes linie 23 og 24 og 'cursor' positioneres til
   23'ende linie inden invitation.
*>
\f

message procedure læs_kommando side 2 - 810428/hko;

begin
  integer
    a_pos,
    a_res,res,
    i,j,k;
  boolean
    skip;

<*V*>setposition(z,0,0);

  case kilde//100 of
  begin
    begin <* io *>
      write(z,"nl",1,">",1);
    end;

    begin <* operatør *>
      cursor(z,24,1);
      write(z,"esc" add 128,1,<:ÆK:>);
      cursor(z,23,1);
      write(z,"esc" add 128,1,<:ÆK:>);
      outchar(z,'>');
    end;

    begin <* garageterminal *> ;
      outchar(z,'nl');
    end
  end;

<*V*>setposition(z,0,0);
\f

message procedure læs_kommando side 3 - 810921/hko,cl;

    res:=0;
    skip:= false;
<*V*>
    k:=læs_store(z,i);

    apos:= 1;
    while k<=6 <*klasse=bogstav*> do
    begin
      if a_pos<3 then skriv_tegn(d.op_ref.data,apos,i);
<*V*> k:= læs_store(z,i);
    end;

    skip:= skip or i='?' or (a_pos=1 and (i=',' or i=';'));

    if i=',' and a_pos>1 then
    begin
      skrivtegn(d.op_ref.data,a_pos,i);
      repeat
  <*V*> k:= læs_store(z,i);
        if a_pos=4 and k=6 then skriv_tegn(d.op_ref.data,a_pos,i);
      until k>=7;
    end;

    pos:=a_pos;
    while k<8 do
    begin
      if a_pos< (att_op_længde//2*3-2) then
        skriv_tegn(d.op_ref.data,a_pos,i);
      skip:= skip or i='?';
<*V*> k:= læs_store(z,i);
      pos:=pos+1;
    end;

    skip:= skip or i='?' or i='esc';
    slut_tegn:= i;
    skrivtegn(d.op_ref.data,apos,'em');
    afslut_text(d.op_ref.data,apos);
\f

message procedure læs_kommando side 4 - 820301/hko/cl;

  disable
  begin
    integer
      i1,
      nr,
      partype,
      cifre;
    integer array
      spec(1:1),
      værdi(1:4);

<*+2*>
    if testbit25 and overvåget then
    disable begin
      real array field raf;
      write(out,"nl",1,<:kommando læst::>);
      laf:=data;
      write(out,d.op_ref.laf,<:<'<'>sluttegn<'>'>=:>,<<d>,sluttegn,
                <: skip=:>,if skip then <:true:> else <:false:>);
      ud;
    end;
<*-2*>

    for i:=1 step 1 until 32 do ia(i):=0;

    if skip then
    begin
      res:=53; <*annulleret*>
      pos:= -1;
      goto slut_læskommando;
    end;
\f

message procedure læs_kommando side 5 - 850820/cl;

    i:= kilde//100; <* hovedmodul *>
    k:= kilde mod 100; <* løbenr *>
<*  if pos>79 then linieoverløb; *>
    pos:=a_pos:=0;
    spec(1):= ',' shift 16;

<*+4*>
    if k<1 or k>(case i of (1,max_antal_operatører,
                              max_antal_garageterminaler)) then
    begin
      fejlreaktion(3<*programfejl*>,kilde,<:ukendt kilde til kommando:>,1);
      res:=31;
    end
    else
<*-4*>
    if i>0 and i<4 then <* io, operatør eller garageterminal *>
    begin
      <* læs operationskode *>
      j:=param(d.op_ref.data,apos,spec,tf_kommandotabel,cifre,værdi,sep);

      res:= if j=1 and sep='.' and i=2<*operatør*> then -1 <* skærmopdatering *>
            else if cifre>0 or j=1 or j=3 or j=5 then  24 <* syntaks *>
            else if j=2 then 4 <*ukendt kommando*>
            else if j=4 then 31 <*systemfejl: ukendt tabelfil*>
            else if sep<>'sp' and sep<>','
                    and sep<>'nl' and sep<>';'
                    and sep<>'nul' and sep<>'em' then 26
                                                       <*skilletegn*>
            else if -, læsbit_i(værdi(4),i-1) then 4 
<*                  logand(extend 0 add værdi(4)
                           extend 1 shift (case i of (0,k,8+k)))=0 then 4
*>                                                   <*ukendt kommando*>
            else 1;
\f

message procedure læs_kommando side 5a- 810409/hko;

<*+2*>if testbit25 and overvåget then
      begin
        write(out,"nl",0,<:funk opslag: param,apos,cifre,sep,res::>,
              << -dddd>,j,apos,cifre,sep,res,
              <:   værdi(1-4)::>,værdi(1),værdi(2),værdi(3),værdi(4),
              "nl",0);
        if j<>0 then skriv_op(out,op_ref);
        ud;
      end;
<*-2*>

      if res=31 then fejlreaktion(18<*tabelfil*>,j,
                                  <:=res, filnr 1025, læskommando:>,0);

      if res=1 then <* operationskode ok *>
      begin
        if sep<>'sp' then apos:=apos-1;
        d.op_ref.opkode:=værdi(1);
        indeks:=værdi(2);
        partype:= værdi(3);
        nr:= 0;
        pos:= apos;
\f

message procedure læs_kommando side 6 - 810409/hko;

        while res=1 do
        begin
          læs_param_sæt(d.op_ref.data,apos,0<*indtil 3 enkeltparametre*>,
                        værdi,sep,a_res);
          nr:= nr +1;
          i1:= værdi(1);
<*+2*>  if testbit25 and overvåget then
        begin
          write(out,"nl",1,<:param sæt: apos,sep,ares::>,<< -dddddd>,
                apos,sep,ares,<:   værdi(1-4)::>,
                værdi(1),værdi(2),værdi(3),værdi(4),
                "nl",0);
          ud;
       end;
<*-2*>
          case par_type of
          begin

<*1: (<ingenting>!<busnr> (<omr>)!<linienr>/<løbnr> (<omr>)) *>

            begin
              if nr=1 then
              begin
                if a_res=0 then res:=2 <*godkendt*>
                else if a_res=2 and (i1<1 or i1>9999)
                     then res:=7 <*busnr ulovligt*>
                else if a_res=2 or a_res=6 then
                begin
                  ia(1):= if a_res=2 then i1
                                     else 1 shift 22 +i1;
                end
                else res:= 27; <*parametertype*>
                if res<4 then pos:= apos;
              end <*nr=1*>
              else
              if nr=2 then
              begin
                if ares=0 then res:= 2 <*godkendt*>
                else if ares=1 then
                begin
                  ia(2):= find_område(i1);
                  if ia(2)=0 then res:= 17; <* kanal-nr ukendt *>
                end
                else res:= 27; <* syntaks, parametertype *>
              end
              else
              if ares=0 then res:= 2<*godkendt*> else res:= 24 <* syntaks *>;
            end;
\f

message procedure læs_kommando side 7 - 810226/hko;

<*2: (<busnr> (<område>)!<linie>/<løbnr>) *>

            begin
              if nr=1 then
              begin
                if a_res=0 then res:=25 <*parameter mangler*>
                else if a_res=2 and (i1<1 or i1>9999)
                     then res:=7 <*busnr ulovligt*>
                else if a_res=2 or a_res=6 then
                begin
                  ia(1):=if a_res=2 then i1
                                    else 1 shift 22 +i1;
                end
                else res:= 27; <*parametertype*>
                if res<4 then pos:=a_pos;
              end
              else
              if nr=2 then
              begin
                if ares=0 then res:= 2 <*godkendt*> else
                if ares=1 and ia(1) shift (-21) = 0 then
                begin
                  ia(2):= findområde(i1);
                  if ia(2)=0 then res:= 56; <*område ukendt*>
                end
                else res:= 27;
                if res<4 then pos:= apos;
              end
              else
              if ares=0 then res:= 2 else res:= 24<*syntaks*>;
            end;
\f

message procedure læs_kommando side 8 - 810223/hko;

<*3: (<linie>!G<nr>) *>

            begin
              if nr=1 then
              begin
                if a_res=0 then res:=25 <*parameter mangler*>
                else if a_res=2 and (i1<1 or i1>999) then res:=5
                                                    <*linienr ulovligt*>
                else if a_res=2 or a_res=4 or a_res=5 then
                begin
                  ia(1):=
                    if a_res=2 then      4 shift 21 +i1 shift 5
                    else if a_res=4 then 4 shift 21 +i1
                    else <* a_res=5 *>   5 shift 21 +i1;
                end
                else res:=27; <* parametertype *>
                if res<4 then pos:= a_pos;
              end
              else
              res:= if nr=2 and a_res<>0 then 24<*syntaks*>
                                         else 2;<*godkendt*>
            end;

<*4:  <ingenting> *>

            begin
              res:= if a_res<>0 then 24<*syntaks*>
                                else 2;<*godkendt*>
            end;
\f

message procedure læs_kommando side 9 - 810226/hko;

<*5: (<kanalnr>) *>

            begin
              long field lf;

              if nr=1 then
              begin
                if a_res=0 then res:= 25
                else if a_res<>1 then res:=27<*parametertype*>
                else
                begin
                  j:= 0; lf:= 4;
                  for i:= 1 step 1 until max_antal_kanaler do
                    if kanal_navn(i)=værdi.lf then j:= i;
                  if j<>0 then
                  begin
                    ia(1):= 3 shift 22 + j;
                    res:= 2;
                  end
                  else
                    res:= 17; <* kanal ukendt *>
                end;
                if res<4 then pos:= a_pos;
              end
              else
              res:=if nr=2 and a_res<>0 then 24<*syntaks*>
                                        else 2;<*godkendt*>
            end;
\f

message procedure læs_kommando side 10 - 810415/hko;

<*6:  <busnr>/<linie>/<løb> (<område>) *>

            begin
              if nr=1 then
              begin
                if a_res=0 then res:=25<*parameter mangler*>
                else if a_res=7 then
                begin
                  ia(1):= i1;
                  ia(2):= 1 shift 22 + værdi(2);
                end
                else res:=27;<*parametertype*>
                if res<4 then pos:= apos;
              end
              else
              if nr=2 then
              begin
                if ares=0 then res:= 2 <*godkendt*> else
                if ares=1 then
                begin
                  ia(3):= findområde(i1);
                  if ia(3)=0 then res:= 56; <* område ukendt *>
                end
                else res:= 27; <*parametertype*>
                if res<4 then pos:= apos;
              end
              else
              if ares=0 then res:= 2 else res:= 24;
            end;
\f

message procedure læs_kommando side 11 - 810512/hko/cl;


<*                                                 att_op_længde//2-2 *>
<*7:  <linienr>.<indeks>:<løbnr> (<interval>.<løb>)                   *>
<*                                                  1                 *>

            begin
              if nr=1 then
              begin
                if a_res=0 then res:=25 <*parameter mangler*>
                else if a_res=8 then
                begin
                  ia(1):= 4 shift 21 + i1;
                  ia(2):= værdi(2);
                  ia(3):= værdi(3);
                  indeks:= 3;
                end
                else res:=27;<*parametertype*>
              end
              else if nr<=att_op_længde//2-2 then
              begin
                if a_res=0 and (sep=',' or nr>2) then res:=2<*godkendt*>
                else if a_res=0 then res:=25 <* parameter mangler *>
                else if a_res=10 then
                begin
                  if i1>0 and i1<100 and værdi(2)>0 and værdi(2)<100 then
                  begin
                    ia(nr+2):= i1 shift 12 + værdi(2);
                    indeks:= nr +2;
                  end
                  else if i1<1 or i1>99 then res:=44 <*intervalstr. ulovlig*>
                  else res:=6; <*løb-nr ulovligt*>
                end
                else res:=27;<*parametertype*>
              end
              else
                res:= if a_res=0 then 2 else 24;<* syntaks *>
              if res<4 then pos:=a_pos;
            end;
\f

message procedure læs_kommando side 12 - 810306/hko;

<*8: (<operatør>!<radiokanal>!<garageterminal>) *>

            begin
              if nr=1 then
              begin
                if a_res=0 then res:=25 <* parameter mangler *>
                else if a_res=2 then
                begin
                  j:=d.op_ref.opkode;
                  ia(1):=i1;
                  k:=(j+1)//2;
                  if k<1 or k=3 or k>4 then
                    fejlreaktion(3<*programfejl*>,j,<:opkode, partype=8:>,1)
                  else
                  begin
                    if k=4 then k:=3;
                    if i1<1 or i1> (case k of
                      (max_antal_operatører,max_antal_radiokanaler,
                       max_antal_garageterminaler))
                    then res:=case k of (28,29,17);
                  end;
                end
                else if a_res=1 and (d.op_ref.opkode+1)//2=1 then
                begin
                  laf:= 0;
                  ia(1):= find_bpl(værdi.laf(1));
                  if ia(1)<1 or ia(1)>max_antal_operatører then res:=28;
                end
                else res:=27; <*parametertype*>
              end
              else
              if nr=2 and d.opref.opkode=1 then
              begin
                <* åbningstilstand for operatørplads *>
                if a_res=0 then res:= 2 <*godkendt*>
                else if a_res<>1 then res:= 27 <*parametertype*>
                else begin
                  res:= 2<*godkendt*>;
                  j:= værdi(1) shift (-16);
                  if j='S' then ia(2):= 3 else
                  if j<>'Å' then res:= 24; <*syntaks*>
                end;
              end
              else 
              begin
                res:=if a_res=0 then  2 <* godkendt *>
                                else 24;<* syntaks *>
              end;
              if res<4 then pos:=a_pos;
            end; <* partype 8 *>
\f

message procedure læs_kommando side 13 - 810306/hko;


<*                              att_op_længde//2 *>
<*9:  <operatør>((+!-)<linienr>)                 *>
<*                              1                *>

            begin
              if nr=1 then
              begin
                if a_res=0 then res:=25 <* parameter mangler *>
                else if a_res=2 then
                begin
                  ia(1):=i1;
                  if i1<1 or i1>max_antal_operatører then res:=28;
                end
                else if a_res=1 then
                begin
                  laf:= 0;
                  ia(1):= find_bpl(værdi.laf(1));
                  if ia(1)<1 or ia(1)>max_antal_operatører then res:=28;
                end
                else res:=27; <* parametertype *>
              end
              else if nr<=att_op_længde//2 then
              begin <* nr>1 *>
                if a_res=0 then res:=(if nr>2 then 2 else 25)
                else if a_res=2 or a_res=3 then
                begin
                  ia(nr):=i1; indeks:= nr;
                  if i1=0 or abs(i1)>999 then res:=5;
                end
                else res:=27; <* parametertype *>
                if res<4 then pos:=a_pos;
              end
              else
                res:=if a_res<>0 then 24 <* syntaks (for mange parametre) *>
                                 else 2;
            end; <* partype 9 *>
\f

message procedure læs_kommando side 14 - 810428/hko;

<*         2 *>
<*10: (bus)  *>
<*         1 *>

            begin
              if a_res=0 and nr=1 then res:=25 <* parameter mangler *>
              else if a_res<>0 and nr>2 then res:=24 <* syntaks (for mange) *>
              else if a_res=0 then res:=2 <* godkendt *>
              else if a_res<>2 then res:=27 <* parametertype *>
              else if i1<1 or i1>9999 then res:=7 <*ulovligt busnr *>
              else
                ia(nr):=i1;
            end;

<*             5 *>
<*11: (<linie>)  *>
<*             1 *>

            begin
              if a_res=0 and nr=1 then res:=25
              else if a_res<>0 and nr>5 then res:=24
              else if a_res=0 then res:=2
              else if a_res<>2 and a_res<>4 then res:=27
              else if a_res=2 and (i1<1 or i1>999) then res:=5 <* ulovl.linie *>
              else
                ia(nr):=
                  (if a_res=4 then i1 else i1 shift 5) + 4 shift 21;
            end;
\f

message procedure læs_kommando side 15 - 810306/hko;

<*12: (<ingenting>!<navn>) *>

            begin
              if nr=1 then
              begin
                if a_res=0 then res:=2 <*godkendt*>
                else if a_res=1 then
                  tofrom(ia,værdi,8)
                else res:=27; <* parametertype *>
              end
              else
                res:=if a_res<>0 then 24 <* syntaks (for mange) *>
                                 else  2;
            end; <* partype 12 *>
\f

message procedure læs_kommando side 16 - 810512/hko/cl;

<*                                                         15 *>
<*13: G<grp.nr>:(<bus>!<linie>/<løb>) (<bus>!<linie>/<løb>)   *>
<*                                                         1  *>

            begin
              if nr=1 then
              begin
                if a_res=0 then res:=25 <* parameter mangler *>
                else
                if a_res=11 then
                begin
                  ia(1):= 5 shift 21 + i1;
                  ia(2):=værdi(2);
                  indeks:= 2;
                end
                else res:=27; <* parametertype *>
              end
              else if nr<= att_op_længde//2-1 then
              begin
                if a_res=0 and(sep=',' or nr>2)then res:=2 <* godkendt *>
                else if a_res=0 then res:=25 <* parameter mangler *>
                else if ares=2 and (i1<1 or i1>9999) then
                        res:= 7 <*busnr ulovligt*>
                else if a_res=2 or a_res=6 then
                begin
                  ia(nr+1):=i1+ (if a_res=6 then 1 shift 22 else 0);
                  indeks:= nr+1;
                end
                else res:=27; <* parametertype *>
              end
              else
                res:=if a_res=0 then  2 <*godkendt *>
                                else 24;<* syntaks *>
              if res<4 then pos:=a_pos;
            end; <* partype 13 *>
\f

message procedure læs_kommando side 17 - 810311/hko;

<*14: <linie>.<indeks> *>

            begin
              if nr=1 then
              begin
                if a_res=0 then res:=25 <* parameter mangler *>
                else if a_res=9 then
                begin
                  ia(1):= 1 shift 23 +i1;
                  ia(2):= værdi(2);
                end
                else res:=27; <* parametertype *>
              end
              else <* nr>1 *>
                res:= if a_res=0 then  2 <* godkendt *>
                                 else 24;<* syntaks *>
            end; <* partype 14 *>
\f

message procedure læs_kommando side 18 - 810313/hko;

<*15: <linie>.<indeks> <bus> *>

            begin
              if nr=1 then
              begin
                if a_res=0 then res:= 25 <* parameter mangler *>
                else if a_res=9 then
                begin
                  ia(1):= 1 shift 23 +i1;
                  ia(2):= værdi(2);
                end
                else res:=27; <* parametertype *>
              end
              else if nr=2 then
              begin
                if a_res=0 then res:=25
                else if a_res=2 then
                begin
                  if i1<1 or i1>9999 then res:=7 <* ulovligt busnr *>
                  else ia(3):= i1;
                end
                else res:=27; <*parametertype *>
              end
              else
                res:=if a_res=0 then  2 <* godkendt *>
                                else 24;<* syntaks *>
              if res<4 then pos:=a_pos;
            end; <* partype 15 *>
\f

message procedure læs_kommando side 19 - 810311/hko;

<*16: (<ingenting>!D.<dato>.<klokkeslet> *>

            begin
              if nr=1 then
              begin
                if a_res=0 then res:=2 <* godkendt *>
                else if a_res=12 then
                begin
                  raf:=0;
                  ia.raf(1):= systid(i1,værdi(2));
                end
                else res:=27; <* parametertype *>
              end
              else
                res:= if a_res=0 then  2 <* godkendt *>
                                 else 24;<* syntaks *>
              if res<4 then pos:=a_pos;
            end; <* partype 16 *>
\f

message procedure læs_kommando side 20 - 810511/hko;

<*17: G<grp.nr> *>

            begin
              if nr=1 then
              begin
                if a_res=0 then res:=25 <*parameter mangler *>
                else if a_res=5 then
                begin
                  ia(1):= 5 shift 21 +i1;
                end
                else res:=27; <* parametertype *>
              end
              else
                res:= if a_res=0 then  2 <* godkendt *>
                                 else 24;<* syntaks *>
            end; <* partype 17 *>

<*               att_op_længde//2 *>
<*18: (<heltal>)                  *>
<*               1                *>

            begin
              if nr=1 and a_res=0 then res:= 25 <*parameter mangler*>
              else
              if nr<=att_op_længde//2 then
              begin
                if a_res=2 or a_res=3 <* pos/neg heltal *> then
                begin
                  ia(nr):= i1; indeks:= nr;
                end
                else if a_res=0 then res:= 2
                else res:= 27; <*parametertype*>
              end
              else
              res:= if a_res=0 then 2 else 24;<*syntaks (for mange)*>
            end;
\f

message procedure læs_kommando side 21 - 820302/cl;

<*19: <linie>/<løb>  <linie>/<løb> *>

            begin
              if nr<3 and a_res=0 then res:= 25 <*parameter mangler*>
              else if nr<3 and a_res<>6 then res:= 27 <*parametertype*>
              else if nr<3 then
              begin
                ia(nr):=i1 + 1 shift 22;
              end
              else
                res:= if a_res=0 then 2 <*godkendt*>
                                else 24;<*syntaks (for mange)*>
              if res<4 then pos:= a_pos;
            end; <* partype 19 *>

<*20: <busnr> <kortnavn> *>
            begin
              if nr=1 then
              begin
                if ares=0 then res:= 25 else
                if ares=2 and (i1<1 or 9999<i1) then res:= 24 else
                if ares<>2 then res:= 27 else ia(1):= i1;
              end
              else
              if nr=2 then
              begin
                if ares=1 and værdi(2) extract 8 = 0 then
                begin
                  ia(2):= værdi(1); ia(3):= værdi(2);
                end
                else res:= if ares=0 then 25 else if ares=1 then 62 else 27;
              end
              else
              if ares=0 then res:= 2 else res:= 24;
            end; <* partype 20 *>
\f

message procedure læs_kommando side 22 - 851001/cl;

<*                2                                     *>
<*21:  ( <linie> )    (<garage> ! OMR (ALL ! <område>)) *>
<*                0                                     *>

            begin
              laf:= 0;
              if nr=1 and a_res=0 then res:= 25 <*parameter mangler*>
              else if a_res=0 and (ia(3)=-2 or ia(3)=0) then res:= 25
              else if a_res<>0 and nr>4 then res:= 24 <*syntaks (for mange)*>
              else if a_res=0 then res:= 2 <*godkendt*>
              else if a_res=2 and (i1<1 or i1>999) then res:= 5 <*ulovligt*>
              else if (a_res=2 or a_res=4) and nr<=2 then
              begin
                if ia(3)<>0 then res:= 27 else
                ia(nr):= (4 shift 21) + (if a_res=2 then i1 shift 5 else i1);
              end
              else
              if ares=1 then
              begin
                if nr=1 then
                begin
                  ia(1):= (4 shift 21) + (1 shift 5);
                  ia(2):= (4 shift 21) + (999 shift 5);
                end;
                if ia(3)=-2 then
                begin
                  if i1=long<:ALL:> shift (-24) extract 24 then
                    ia(3):= -1
                  else
                  begin
                    ia(3):= findområde(i1);
                    if ia(3)=0 then res:= 56 else
                    ia(3):= 14 shift 20 + ia(3);
                  end;
                end
                else
                if ia(3) = 0 then
                begin
                  if i1 = long<:OMR:> shift (-24) extract (24) then 
                    ia(3):= -2
                  else
                    ia(3):= find_bpl(værdi.laf(1));
                  if ia(3)=0 then res:= 55;
                end
                else res:= 24;
              end
              else res:= 27; <*parametertype*>
              if res<4 then pos:= apos;
            end;

<*22: (<busnr> (<område) ! <linie>/<løb> (<område>) ) *>

            begin
              if nr=1 then
              begin
                if ares=0 then res:= 25 <*parameter mangler*>
                else if ares=2 and (i1<1 or i1>9999) 
                     then res:= 7 <* busnr ulovligt *>
                else if ares=2 or ares=6 then
                begin
                  ia(1):= if ares=2 then i1 else 1 shift 22 + i1;
                end
                else res:= 27 <* parametertype *>
              end
              else
              if nr=2 then
              begin
                if ares=0 then res:= 2 <* godkendt *>
                else if ares=1 then
                begin
                  ia(2):= findområde(i1);
                  if ia(2)=0 then res:= 17 <*kanal ukendt*>
                end
                else
                  res:= 27; <* parametertype *>
              end
              else if ares=0 then res:= 2 <*godkendt*>
                             else res:= 24; <*syntaks*>
              if res < 4 then pos:= apos;
            end;

<*23: ( <linie> (<område>) ! G<nr> (<område>) ) *>

            begin
              if nr=1 then
              begin
                if ares=0 then res:= 25 else
                if ares=2 and (i1<1 or i1>999) then res:= 5 else
                if ares=2 or ares=4 or ares=5 then
                begin
                  ia(1):=
                    if ares=2 then 4 shift 21 + i1 shift 5 else
                    if ares=4 then 4 shift 21 + i1         else
                                   5 shift 21 + i1;
                end
                else res:= 27;
                if res < 4 then pos:= apos;
              end
              else
              if nr=2 then
              begin
                if ares=0 then res:= 2 else
                if ares=1 then
                begin
                  ia(2):= findområde(i1);
                  if ia(2)=0 then res:= 17;
                end
                else res:= 27;
              end
              else
              if ares=0 then res:= 2 else res:= 24;
            end;

<*24: ( <ingenting> ! <område> ! * ) *>

            begin
              if nr=1 then
              begin
                if ares=0 then res:= 2 else
                if ares=1 then
                begin
                  if i1=long<:ALL:> shift (-24) extract 24 then
                    ia(1):= (-1) shift (-3) shift 3
                  else
                  begin
                    k:= findområde(i1);
                    if k=0 then res:= 17 else
                       ia(1):= 14 shift 20 + k;
                  end;
                end
                else res:= 27;
              end
              else
              if ares=0 then res:= 2 else res:= 24;
              if res < 4 then pos:= apos;
            end;

<*25: <område> *>

            begin
              if nr=1 then
              begin
                if ares=0 then res:= 25 else
                if ares=1 then
                begin
                  if i1 = '*' shift 16 then ia(1):= -1 else
                     ia(1):= findområde(i1);
                  if ia(1)=0 then res:= 17;
                end
                else res:= 27;
              end
              else
              if ares=0 then res:= 2 else res:= 24;
              if res < 4 then pos:= apos;
            end;

<*26: <busnr> *>
            begin
              if nr=1 then
              begin
                if ares=0 then res:= 25 else
                if ares=2 and (i1<1 or 9999<i1) then res:= 24 else
                if ares<>2 then res:= 27 else ia(1):= i1;
              end
              else
              if ares=0 then res:= 2 else res:= 24;
            end;

<*                           8 *>
<*27: <operatørnr> (<område>)  *>
<*                           1 *>
            begin
              if nr < 3 and a_res=0 then res:= 25 <*parameter mangler*>
              else if nr=1 then
              begin
                if a_res=2 then
                begin
                  ia(1):= i1;
                  if i1 < 0 or max_antal_operatører < i1 then res:= 28;
                end
                else if a_res=1 then
                begin
                  laf:= 0;
                  ia(1):= find_bpl(værdi.laf(1));
                  if ia(1)<1 or ia(1)>max_antal_operatører then res:=28;
                end
                else res:= 27; <*parametertype*>
              end
              else
              begin
                if a_res=0 then res:= (if nr > 2 then 2 else 25)
                else if nr > 9 then res:= 24
                else if a_res=1 then
                begin
                  ia(nr):= find_område(i1);
                  indeks:= nr;
                  if ia(nr)=0 then res:= 56;
                end
                else res:= 27;
              end;
              if res < 4 then pos:= a_pos;
            end <* partype 27 *>;

<*28: (<ingenting>!<kanalnr>) *>
            begin
              long field lf;

              if nr=1 then
              begin
                if ares=0 then res:= 2 else
                if ares=1 then
                begin
                  j:= 0; lf:= 4;
                  for i:= 1 step 1 until max_antal_kanaler do
                    if kanal_navn(i)=værdi.lf then j:= i;
                  if j<>0 then
                  begin
                    ia(1):= 3 shift 22 + j;
                    res:= 2;
                  end
                  else
                    res:= 17; <*kanal ukendt*>
                end
                else
                  res:= 27; <*parametertype*>
                if res < 4 then pos:= apos;
              end
              else
                res:= if nr=2 and ares<>0 then 24 <*syntaks*> else 2 <*ok*>;
            end;

<*                                    n  *>
<*29:  <btj.pl.navn> ( <operatørnavn>)   *>
<*                                    0  *>
            begin
              laf:= 0;
              if nr=1 then
              begin
                if a_res=0 then res:= 25 <*parameter mangler*>
                else if a_res<>1 or værdi(2) extract 8 <>0 then res:= 27
                else begin
                  indeks:= 2;
                  ia(1):= værdi(1); ia(2):= værdi(2);
                  j:= find_bpl(værdi.laf(1));
                  if 0<j and j<=max_antal_operatører then
                    res:= 62; <*ulovligt navn*>
                end;
              end
              else
              begin
                if a_res=0 then res:= 2 <*godkendt*>
                else if a_res<>1 then res:= 27 <*parametertype*>
                else begin
                  indeks:= indeks+1;
                  ia(indeks):= find_bpl(værdi.laf(1));
                  if ia(indeks)=0 or ia(indeks)>max_antal_operatører then
                    res:= 28; <*ukendt operatør*>
                end;
              end;
              if res<4 then pos:= a_pos;
            end;
            
<*                                        3  *>
<*30:  (<operatørnavn>)   ( <btj.pl.navn>)   *>
<*                     io                 0  *>
      
            begin
              boolean io;

              io:= (kilde//100 = 1);
              laf:= 0;
              if -,io and nr=1 then
              begin
                indeks:= 1;
                ia(1):= kilde mod 100; <*egen operatørplads*>
              end;

              if io and nr=1 then
              begin
                if a_res=0 then res:= 25 <*parameter mangler*>
                else if a_res<>1 then res:= 27 <*parametertype*>
                else begin
                  indeks:= nr;
                  ia(indeks):= find_bpl(værdi.laf(1));
                  if ia(indeks)=0 or ia(indeks)>max_antal_operatører then
                    res:= 28; <*ukendt operatør*>
                end;
              end
              else
              begin
                if a_res=0 then res:= 2<*godkendt*> 
                else if indeks=4 then res:= 24 <*syntaks, for mange*>
                else if a_res<>1 then res:= 27 <*parametertype*>
                else begin
                  indeks:= indeks+1;
                  ia(indeks):= find_bpl(værdi.laf(1));
                  if ia(indeks)=0 then res:= 46 <*navn ukendt*>
                  else if ia(indeks)=ia(1) then res:= 62; <*ulovligt navn*>
                end;
              end;
              if res<4 then pos:= a_pos;
            end;
                
<*                                               *>
<*31:  <operatørnr> ( <navn> (<ingenting>!Å!S) ) *>
<*                                               *>

            begin
              laf:= 0;
              if nr<2 and a_res=0 then res:= 25 <*parameter mangler*>
              else
              if nr=1 then
              begin
                if a_res=2 then
                begin
                  ia(1):= i1;
                  if i1<=0 or max_antal_operatører<i1 then res:= 28; <*ukendt*>
                end else res:= 27; <*parametertype*>
              end
              else
              if nr=2 then
              begin
                if a_res=1 and værdi(2) extract 8 = 0 then
                begin
                  ia(2):= værdi(1); ia(3):= værdi(2);
                  j:= find_bpl(værdi.laf(1));
                  if j>0 and j<>ia(1) then res:= 48 <*i brug*>;
                end
                else res:= if a_res=0 then 2 <*godkendt*> 
                                      else 27 <*parametertype*>;
              end 
              else
              if nr=3 then
              begin
                if a_res=0 then res:=2 <*godkendt*>
                else if a_res<>1 then res:= 27 <*parametertype*>
                else begin
                  j:= værdi(1) shift (-16);
                  if j='Å' then ia(4):=  1 else
                  if j='S' then ia(4):=  3 else res:= 24 <*syntaks*>;
                end;
              end
              else res:= if a_res=0 then 2 <*godkendt*> else 24 <*syntaks*>;
              if res<4 then pos:= a_pos;
            end;

<*            1   *>
<*32: (heltal)    *>
<*            0   *>
            begin
              if nr=1 then
              begin
                if ares=0 then
                begin
                  indeks:= 0; res:= 2;
                end
                else
                if ares=2 or ares=3 then
                begin
                  ia(nr):= i1; indeks:= nr;
                end
                else res:=27; <*parametertype*>
              end
              else
                res:= (if ares<>0 then 24 <*syntaks, for mange*> else 2);
              if res < 4 then pos:= a_pos;
            end;

<*33 generel tekst*>
            begin 
              integer p,p1,ch,lgd;

              if nr=1 and a_res<>0 then
              begin
                p:=pos; p1:=1;
                lgd:= (op_spool_postlgd-op_spool_text)//2*3-1;
                if 95<lgd then lgd:=95;
                repeat læstegn(d.opref.data,p,ch) until ch<>' ';
                while ch<>'nl' and ch<>'em' and ch<>0 and p1<lgd do
                begin
                  skrivtegn(ia,p1,ch);
                  læstegn(d.opref.data,p,ch);
                end;
                if p1=1 then res:= 25 else res:= 2;
                repeat skrivtegn(ia,p1,0) until (p1 mod 6)=1;
              end
              else
              if a_res=0 then res:= 25 else res:= 24;
            end;

<*34: (heltal)    *>
            begin
              if nr=1 then
              begin
                if ares=0 then res:= 25 else
                if ares=2 or ares=3 then
                begin
                  ia(nr):= i1; indeks:= nr;
                end
                else res:=27; <*parametertype*>
              end
              else
                res:= (if ares<>0 then 24 <*syntaks, for mange*> else 2);
              if res < 4 then pos:= a_pos;
            end;
            
<*+4*>      begin
              fejlreaktion(4<*systemfejl*>,partype,
                           <:parametertype fejl i kommandofil:>,1);
              res:=31;
            end
<*-4*>
          end;<*case partype*>
        end;<* while læs_param_sæt *>
      end; <* operationskode ok *>
    end
    else
    begin
      fejlreaktion(3<*programfejl*>,kilde,<:kilde:>,1);
    end;

    if a_res<0 then res:= -a_res;
slut_læskommando:

    læs_kommando:=d.op_ref.resultat:= res;
  end;<* disable-blok*>
end læs_kommando;
\f

message procedure skriv_kvittering side 1 - 820301/hko/cl;

procedure skriv_kvittering(z,ref,pos,res);
  value                      ref,pos,res;
  zone                     z;
  integer                    ref,pos,res;
  begin
    integer array field op;
    integer pos1,tegn;
    op:=ref;
    if res<1 or res>3 then write(z,<:*** :>);
    write(z,case res+1 of (
<* 0*><:ubehandlet:>,
<* 1*><:ok:>,
<* 2*><:godkendt:>,
<* 3*><:udført:>,
<* 4*><:kommando ukendt:>,

<* 5*><:linie-nr ulovligt:>,
<* 6*><:løb-nr ulovligt:>,
<* 7*><:bus-nr ulovligt:>,
<* 8*><:gruppe ukendt:>,
<* 9*><:linie/løb ukendt:>,

<*10*><:bus-nr ukendt:>,
<*11*><:bus allerede indsat på :>,
<*12*><:linie/løb allerede besat af :>,
<*13*><:bus ikke indsat:>,
<*14*><:bus optaget:>,

<*15*><:gruppe optaget:>,
<*16*><:skærm optaget:>,
<*17*><:kanal ukendt:>,
<*18*><:bus i kø:>,
<*19*><:kø er tom:>,

<*20*><:ej forbindelse :>,
<*21*><:ingen at gennemstille til:>,
<*22*><:ingen samtale at nedlægge:>,
<*23*><:ingen samtale at monitere:>,
<*24*><:syntaks:>,

<*25*><:syntaks, parameter mangler:>,
<*26*><:syntaks, skilletegn:>,
<*27*><:syntaks, parametertype:>,
<*28*><:operatør ukendt:>,
<*29*><:garageterminal ukendt:>,
\f


<*30*><:rapport kan ikke dannes:>,
<*31*><:systemfejl:>,
<*32*><:ingen fri plads:>,
<*33*><:gruppe for stor:>,
<*34*><:gruppe allerede defineret:>,

<*35*><:springsekvens for stor:>,
<*36*><:spring allerede defineret:>,
<*37*><:spring ukendt:>,
<*38*><:spring allerede igangsat:>,
<*39*><:bus ikke reserveret:>,

<*40*><:gruppe ikke reserveret:>,
<*41*><:spring ikke igangsat:>,
<*42*><:intet frit linie/løb:>,
<*43*><:ændring af dato/tid ikke lovlig:>,
<*44*><:interval-størrelse ulovlig:>,

<*45*><:ikke implementeret:>,
<*46*><:navn ukendt:>,
<*47*><:forkert indhold:>,
<*48*><:i brug:>,
<*49*><:ingen samtale igang:>,

<*50*><:kanal:>,
<*51*><:afvist:>,
<*52*><:kanal optaget :>,
<*53*><:annulleret:>,
<*54*><:ingen busser at kalde op:>,

<*55*><:garagenavn ukendt:>,
<*56*><:område ukendt:>,
<*57*><:område nødvendigt:>,
<*58*><:ulovligt område for bus:>,
<*59*><:radiofejl :>,

<*60*><:område kan ikke opdateres:>,
<*61*><:ingen talevej:>,
<*62*><:ulovligt navn:>,
<*63*><:alarmlængde: :>,
<*64*><:ulovligt tal:>,

<*99*><:- <'?'> -:>));
\f

message procedure skriv_kvittering side 3 - 820301/hko;
   if res=3 and op<>0 then
    begin
      if d.op.opkode=20 or d.op.opkode=11 then <*vogntabel,flyt -,indsæt*>
      begin
        i:= d.op.data(if d.op.opkode=20 then 4 else 3) extract 14;
        if i<>0 then write(z,i,<: udtaget:>);
      end;
    end;
    if res = 11 or res = 12 then
      i:=ref;
    if res=11 then write(z,i shift(-12) extract 10,
                           if i shift(-7) extract 5 =0 then false
                           else "A" add (i shift(-7) extract 5 -1),1,
                           <:/:>,<<d>,i extract 7) else
    if res=12 then write(z,i extract 14) else
    if res = 20 or res = 52 or res = 59 then
    begin
      i:= d.op.data(12);
      if i <> 0 then skriv_id(z,i,8);
      i:=d.op.data(2);
      if i=0 then i:=d.op.data(9);
      if i=0 then i:=d.op.data(8);
      skriv_id(z,i,8);
    end;
    if res=63 then
    begin
      i:= ref;
      if i<0 then write(z,<:uendelig:>) else write(z,<<d>,i,<: sek.:>);
    end;

    if pos>=0 then
    begin
      pos:=pos+1;
      outchar(z,':');
      tegn:=-1;
      while tegn<>10 and tegn<>0 do
        outchar(z,læs_tegn(d.op.data,pos,tegn));
    end;
<*V*>setposition(z,0,0);
  end skriv_kvittering;
\f

message procedure cursor, side 1 - 810213/hko;

procedure cursor(z,linie,pos);
  value            linie,pos;
  zone           z;
  integer          linie,pos;
  begin
    if linie>0 and linie<25
       and pos>0 and pos<81 then
    begin
      write(z,"esc" add 128,1,<:Æ:>,
        <<d>,linie,<:;:>,pos,<:H:>);
    end;
  end cursor;
\f

message procedure attention side 1 - 810529/hko;

  procedure attention;
  begin
    integer i, j, k;
    integer array field op_ref,mess_ref;
    integer array att_message(1:9);
    long array field laf1, laf2;
    boolean optaget;
  procedure skriv_attention(zud,omfang);
    integer                     omfang;
    zone                    zud;
  begin
    write(zud,"nl",1,<:+++ attention            :>);
    if omfang <> 0 then
    disable begin integer x;
      trap(slut);
      write(zud,"nl",1,
        <:  i:         :>,i,"nl",1,
        <:  j:         :>,j,"nl",1,
        <:  k:         :>,k,"nl",1,
        <:  op-ref:    :>,op_ref,"nl",1,
        <:  mess-ref:  :>,mess_ref,"nl",1,
        <:  optaget:   :>,if optaget then <:true:>else<:false:>,"nl",1,
        <:  laf2       :>,laf2,"nl",1,
        <:  att-message::>,"nl",1,
        <::>);
      raf:= 0;
      skriv_hele(zud,att_message.raf,18,127);
      skriv_coru(zud,coru_no(010));
slut:
    end;
  end skriv_attention;

  integer procedure udtag_tal(tekst,pos);
    long array tekst;
    integer pos;
  begin
    integer i;

    if getnumber(tekst,pos,i) >= 0 then
      udtag_tal:= i
    else
      udtag_tal:= 0;
  end;

  for i:= 1 step 1 until att_maske_lgd//2 do
     att_signal(i):=att_flag(i):=0;
  trap(att_trap);
  stack_claim((if cm_test then 198 else 146)+50);
<*+2*>
  if testbit26 and overvåget or testbit28 then
    skriv_attention(out,0);
<*-2*>
\f

message procedure attention side 2 - 810406/hko;

  repeat

    wait_ch(cs_att_pulje,opref,true,-1<*vent ubegrænset*>);

    repeat
<*V*> c_wait_message(att_proc_ref,att_message,mess_ref,-1<*vent ubegrænset*>);
      raf:= laf1:= 0;
      laf:=core.mess_ref(4)+2;  <* reference til sender-procesnavn *>

<*+2*>if testbit7 and overvåget then
      disable begin
        laf2:= abs(laf);
        write(out,"nl",1,<:attention - :>);
        if laf<=0 then write(out,<:Regrettet :>);
        write(out,<:Message modtaget fra :>);
        if laf2 > 0 then write(out,core.laf2) else write(out,<:???:>);
        skriv_hele(out,att_message.raf,16,127);
        ud;
      end;
<*-2*>
\f

message procedure attention side 3 - 830310/cl;

      if laf <= 0 then
        i:= -1
      else
      if core.laf(1)=konsol_navn.laf1(1)
           and core.laf(2)=konsol_navn.laf1(2) then 
        i:= 101
      else
      begin
        i:= -1; j:= 1;
        while i=(-1) and (j <= max_antal_operatører) do
        begin
          laf2:= (j-1)*8;
          if core.laf(1) = terminal_navn.laf2(1) 
             and core.laf(2) = terminal_navn.laf2(2) then i:= 200+j;
          j:= j+1;
        end;
        j:= 1;
        while i=(-1) and (j<=max_antal_garageterminaler) do
        begin
          laf2:= (j-1)*8;
          if core.laf(1) = garage_terminal_navn.laf2(1) 
             and core.laf(2) = garage_terminal_navn.laf2(2) then i:= 300+j;
          j:= j+1;
        end;
      end;

      if i=101 or (201<=i and i<=200+max_antal_operatører)
            <* or (301<=i and i<=300+max_antal_garageterminaler) *>
      then
      begin

        j:= if i=101 then 0 
            else max_antal_operatører*(i//100-2)+i mod 100;

        ref:=j*terminal_beskr_længde;
        att_message(9):=
                  if terminal_tab.ref.terminal_tilstand>=0 then 1 <*normal*>
                  else 4 <*disconnected*>;
        optaget:=læsbit_ia(att_flag,j);
        if optaget and att_message(9)=1 then
          sætbit_ia(att_signal,j,0<*1 for 'husket' attention*>)
        else optaget:=optaget or att_message(9)<>1;
        if i//100=2 and terminal_tab.ref.terminal_tilstand < 0 then
        begin <* att fra ekskluderet operatør - inkluder *>
          start_operation(op_ref,010,cs_att_pulje,1<*IN,O*>);
          d.op_ref.data(1):= i mod 100;
          signalch(cs_rad,op_ref,gen_optype);
          waitch(cs_att_pulje,op_ref,true,-1);
        end;
      end
      else
      begin
        optaget:= true;
        att_message(9):= 2 <*rejected*>;
      end;

      monitor(22)send_answer:(zdummy,mess_ref,att_message);

    until -,optaget;
\f

message procedure attention side 4 - 810424/hko;

    sætbit_ia(att_flag,j,1);

    start_operation(op_ref,i,cs_att_pulje,0);

    signal_ch(case i//100 of (cs_io,cs_op,cs_gar),op_ref,gen_optype);

  until false;

att_trap:

  skriv_attention(zbillede,1);


  end attention;

:5: attention: initialisering
\f

message attention_initialisering side 1 - 850820/cl;

  tf_kommandotabel:= 1 shift 10 + 1;

  begin
    integer i, s, zno;
    zone z(128,1,stderror);
    integer array fdim(1:8);

    fdim(4):= tf_kommandotabel;
    hentfildim(fdim);

    open(z,4,<:htkommando:>,0);
    for i:= 1 step 1 until fdim(3) do
    begin
      inrec6(z,512);
      s:= skrivfil(tf_kommandotabel,i,zno);
      if s<>0 then fejlreaktion(6,s,<:kommandotabelinit:>,0);
      tofrom(fil(zno),z,512);
    end;
    close(z,true);
  end;
\f

message attention_initialisering side 1a - 810428/hko;

  for j:= system(3,i,terminal_tab) step 1 until i do
    terminal_tab(j):= 0;

  cs_att_pulje:=next_semch;
<*+3*> skriv_new_sem(out,3,cs_att_pulje,<:cs-att-pulje:>);
<*-3*>

  bs_fortsæt_adgang:= nextsem;
<*+3*> skriv_new_sem(out,1,bs_fortsæt_adgang,<:bs-fortsæt-adgang:>);
<*-3*>
  signalbin(bs_fortsæt_adgang);

  for i:= 1,
      1 step 1 until max_antal_operatører,
      1 step 1 until max_antal_garageterminaler do

  <* initialisering af pulje med attention_operationer *>

    signalch(cs_att_pulje,    <* pulje_semafor   *>
             nextop(data+att_op_længde), <* næste_operation *>
             gen_optype);

  att_proc_ref:=next_proc_ext(system(6<* own process*>,i,ra));

  i:=next_coru(010,<*ident*>
                 2,<*prioritet*>
               true<*test_maske*>);
  j:=newactivity(        i, <*activityno     *>
                         0, <*ikke virtual   *>
                 attention);<*ingen parametre*>

<*+3*>skriv_newactivity(out,i,j);
<*-3*>

:6: attention trapaktion1.

write(zbillede,"nl",2,"=",20,<: attentionmodul :>,"=",20,"nl",1);

write(zbillede,"nl",1,<:attention-flag: :>,"nl",1);
outintbits_ia(zbillede,att_flag,1,att_maske_lgd//2);

write(zbillede,"nl",1,<:attention-signal: :>,"nl",1);
outintbits_ia(zbillede,att_signal,1,att_maske_lgd//2);
▶EOF◀