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

⟦946be4f23⟧ TextFile

    Length: 124416 (0x1e600)
    Types: TextFile
    Names: »htradio     «

Derivation

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

TextFile

radio.

:1: radio: parametererklæringer
\f

message procedure radio_parametererklæringer side 1 - 810524/hko;

  integer
    radio_giveup,
    opkaldskø_postlængde,
    kanal_beskr_længde,
    radio_op_længde,
    radio_pulje_størrelse;


:2: radio: parameterinitialisering
\f

message procedure radio_parameterinitialisering side 1 - 810601/hko;

    radio_giveup:= 1 shift 21 + 1 shift 9;
    opkaldskø_postlængde:= 10+op_maske_lgd;
    kanal_beskr_længde:= 12+op_maske_lgd+tv_maske_lgd;
    radio_op_længde:= 30*2;
    radio_pulje_størrelse:= 1+max_antal_taleveje;

:3: radio: claiming
\f

message procedure radio_claiming side 1 - 810526/hko;

  max_coru:= max_coru
               +1                         <* hovedmodul radio *>
               +1                         <* opkaldskø_meddelelse *>
               +1                         <* radio_adm *>
               +max_antal_taleveje        <* radio *>
               +2;                        <* radio ind/-ud*>

  max_semch:= max_semch
               +1                         <* cs_rad *>
               +max_antal_taleveje        <* cs_radio *>
               +1                         <* cs_radio_pulje *>
               +1                         <* cs_radio_kø *>
               +1                         <* cs_radio_medd *>
               +1                         <* cs_radio_adm *>
               +2   ;                     <* cs_radio_ind/-ud *>

  max_sem:=
    +1  <* bs_mobil_opkald *>
    +1  <* bs_opkaldskø_adgang *>
    +max_antal_kanaler  <* ss_radio_aktiver *>
    +max_antal_kanaler  <* ss_samtale_nedlagt *>
    +max_antal_taleveje   <* bs_talevej_udkoblet *>
    +max_sem;

  max_op:=
     + radio_pulje_størrelse   <* radio_pulje_operationer *>
     + 1                       <* radio_medd *>
     + 1                       <* radio_adm *>
     + max_antal_taleveje      <* operationer for radio *>
     + 2                       <* operationer for radio_ind/-ud *>
     + max_op;

  max_netto_op:=
     + radio_pulje_størrelse * 60      <* radio_pulje_operationer *>
     + data + 6                        <* radio_medd *>
     + max_antal_taleveje              <* operationer for radio *>
       * (data + radio_op_længde)
     + data + radio_op_længde          <* operation for radio_adm *>
     + 2*(data + 64)                   <* operationer for radio_ind/-ud *>
     + max_netto_op;
:4: radio erklæringer
\f

message procedure radio_erklæringer side 1 - 820304/hko;

zone z_fr_in(14,1,rad_in_fejl),
     z_rf_in(14,1,rad_in_fejl),
     z_fr_out(14,1,rad_out_fejl),
     z_rf_out(14,1,rad_out_fejl);

integer array
    radiofejl,
    ss_samtale_nedlagt,
    ss_radio_aktiver(1:max_antal_kanaler),
    bs_talevej_udkoblet,
    cs_radio(1:max_antal_taleveje),
    radio_linietabel(1:max_linienr//3+1),
    radio_områdetabel(0:max_antal_områder),
    opkaldskø(opkaldskø_postlængde//2+1:
      (max_antal_mobilopkald+1)*opkaldskø_postlængde//2),
    kanal_tab(1:max_antal_kanaler*kanal_beskr_længde//2),
    hookoff_maske(1:(tv_maske_lgd//2)),
    samtaleflag, kanalflag, opkaldsflag(1:(op_maske_lgd//2));

  integer field
    kanal_tilstand,
    kanal_id1,
    kanal_id2,
    kanal_spec,
    kanal_alt_id1,
    kanal_alt_id2;               
  integer array field 
    kanal_mon_maske,
    kanal_alarm,
    opkald_meldt;

  integer
    cs_rad,
    cs_radio_medd,
    cs_radio_adm,
    cs_radio_ind,
    cs_radio_ud,
    cs_radio_pulje,
    cs_radio_kø,
    bs_mobil_opkald,
    bs_opkaldskø_adgang,
    opkaldskø_ledige,
    nødopkald_brugt,
    første_frie_opkald,
    første_opkald,
    sidste_opkald,
    første_nødopkald,
    sidste_nødopkald,
    optaget_flag;

  boolean
    mobil_opkald_aktiveret;
\f

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

  integer
  procedure læs_hex_ciffer(tabel,linie,op);
    value                      linie;
    integer array        tabel;
    integer                    linie,op;
    begin
      integer i,j;

      i:=(if linie>=0 then linie+6 else linie)//6;
      j:=((i-1)*6-linie)*4;
      læs_hex_ciffer:=op:=tabel(i) shift j extract 4;
   end læs_hex_ciffer;

message procedure sæt_hex_ciffer side 1 - 810505/hko;

  integer
  procedure sæt_hex_ciffer(tabel,linie,op);
    value                      linie;
    integer array        tabel;
    integer                    linie,op;
    begin
      integer i,j;

      i:=(if linie>=0 then linie+6 else linie)//6;
      j:=(linie-(i-1)*6)*4;
      sæt_hex_ciffer:= tabel(i) shift (-j) extract 4;
      tabel(i):=tabel(i) shift (-4-j) shift 4 add (op extract 4)
                shift j add (tabel(i) extract j);
    end sæt_hex_ciffer;

message procedure hex_to_dec side 1 - 900108/cl;

integer procedure hex_to_dec(hex);
  value                      hex;
  integer                    hex;
begin
  hex_to_dec:= if 'A'<=hex and hex<='F' then (hex-'A'+10)
               else (hex-'0');
end;

message procedure dec_to_hex side 1 - 900108/cl;

integer procedure dec_to_hex(dec);
  value                      dec;
  integer                    dec;
begin
  dec_to_hex:= if 0<=dec and dec<=9 then ('0'+dec)
               else ('A'+dec-10);
end;

message procedure rad_out_fejl side 1 - 820304/hko;

  procedure rad_out_fejl(z,s,b);
    value                  s;
    zone                 z;
    integer                s,b;
    begin
      integer array field iaf;
      integer pos,tegn,max,i;
      integer array ia(1:20);
      long array field laf;

    disable begin
      laf:= iaf:= 2;
      tegn:= 1;
      getzone6(z,ia);
      max:= ia(16)//2*3;
      if s = 1 shift 21 + 2 then
      begin
        z(1):= real<:<'em'>:>;
        b:= 2;
      end
      else
      begin
        pos:= 0;
        for i:= 1 step 1 until max_antal_kanaler do
        begin
          iaf:= (i-1)*kanalbeskr_længde;
          if sæt_hex_ciffer(kanal_tab.iaf,3,15)<>15 then pos:= pos+1;
          if pos>0 then
          begin
            tofrom(kanalflag,alle_operatører,op_maske_lgd);
            signalbin(bs_mobilopkald);
            fejlreaktion(17<*y.e.status*>,s,string ia.laf(increase(tegn)),
              1 shift 12<*binært*> +1<*fortsæt*>);
          end;
        end;
      end;
    end;
    end;
\f

message procedure rad_in_fejl side 1 - 810601/hko;

  procedure rad_in_fejl(z,s,b);
    value                 s;
    zone                z;
    integer               s,b;
    begin
      integer array field iaf;
      integer pos,tegn,max,i;
      integer array ia(1:20);
      long array field laf;

    disable begin
      laf:= iaf:= 2;
      i:= 1;
      getzone6(z,ia);
      max:= ia(16)//2*3;
      if s shift (-21) extract 1 = 0
         and s shift(-19) extract 1 = 0 then
      begin
        if b = 0 then
        begin
          z(1):= real<:!:>;
          b:= 2;
        end;
      end;
\f

message procedure rad_in_fejl side 2 - 820304/hko;

      if (s <> 1 shift 21 +2 and s shift(-19) extract 1 = 0) then
      begin
        fejlreaktion(17<*ydre enhed status*>,s,string ia.laf(increase(i)),
          1 shift 12<*binær*> +1<*fortsæt*>);
      end
      else
      if s shift (-19) extract 1 = 1 then
      begin
        z(1):= real<:!<'nl'>:>;
        b:= 2;
      end
      else
      if s = 1 shift 21 +2  or s shift(-19) extract 1 =1 then
      begin
<*
        if b = 0 then
        begin
*>
          z(1):= real <:<'em'>:>;
          b:= 2;
<*
        end
        else
        begin
          tegn:= -1;
          iaf:= 0;
          pos:= b//2*3-2;
          while pos < max and tegn <> 0 do læstegn(z.iaf,pos,tegn);
          skriv_tegn(z.iaf,pos,'?');
          if pos<=max then
            afslut_text(z.iaf,pos);
          b:= (pos-1)//3*2;
        end;
*>
      end;<* s=1 shift 21+2 *>
    end;
      if testbit22 and
         (s <> 1 shift 21 +2 and s shift(-19) extract 1 = 0)
      then
        delay(60);
    end rad_in_fejl;
\f

message procedure afvent_radioinput side 1 - 880901/cl;

integer procedure afvent_radioinput(z_in,tlgr,rf);
  value                                     rf;
  zone                            z_in;
  integer array                        tlgr;
  boolean                                   rf;
begin
  integer i, p, pos, tegn, ac, sum, csum, lgd;
  long array field laf;

  laf:= 0;
  pos:= 1;     
  repeat
    i:=readchar(z_in,tegn);
    if i<>8 and pos<80 then skrivtegn(tlgr,pos,tegn);
  until (i=8 and pos>1) or (tegn='em') or (pos>=80);
  p:=pos;
  repeat afsluttext(tlgr,p) until p mod 6 = 1;
<*+2*>if overvåget and (testbit36 or ((-,rf) and testbit38) or
                       (rf and testbit39)) then
      disable begin
        write(zrl,<<zd dd dd.dd >,now,
          (if -,rf then <:fr-tlgr: :> else <:rf-answ: :>),tlgr.laf,
          if tegn='em' then <:*timeout*:> else
          if pos>=80 then   <:*for langt*:> else <::>);
         outchar(zrl,'nl');
      end;
<*-2*>
  ac:= -1;
  if pos >= 80 then
  begin <* telegram for langt *>
    repeat readchar(z_in,tegn)
    until tegn='nl' or tegn='em';
  end
  else
  if pos>1  and tegn='nl' then
  begin
    lgd:= 1;
    while læstegn(tlgr,lgd,tegn)<>0 do ;
    lgd:= lgd-2;
    if lgd >= 5 then
    begin
      lgd:= lgd-2; <* se bort fra checksum *>
      i:= lgd + 1;
      csum:= (læstegn(tlgr,i,tegn) - '@')*16;
      csum:= csum + (læstegn(tlgr,i,tegn) - '@');
      i:= lgd + 1;
      skrivtegn(tlgr,i,0);
      skrivtegn(tlgr,i,0);
      i:= 1; sum:= 0;
      while i <= lgd do
        sum:= (sum + læstegn(tlgr,i,tegn)) mod 256;
      if csum >= 0 and csum <> sum then
      begin
<*+2*>  if overvåget and (testbit36 or
           ((-,rf) and testbit38) or (rf and testbit39)) then
        disable begin
          write(zrl,<<zd dd dd.dd >,now,
            (if rf then <:rf:> else <:fr:>),
            <:-tlgr-checksumfejl: :>,csum,sum); outchar(zrl,'nl');
        end;
<*-2*>
        ac:= 6 <* checksumfejl *>
      end
      else
        ac:= 0;
    end
    else ac:= 6; <* for kort telegram - retransmitter *>
  end;
  afvent_radioinput:= ac;
end;
\f

message procedure skriv_kanal_tab side 1 - 820304/hko;

  procedure skriv_kanal_tab(z);
    zone                    z;
    begin
      integer array field ref;
      integer i,j,t,op,id1,id2;

      write(z,"ff",1,"nl",1,<:
     ******** kanal-beskrivelser *******

                   a k l p m b n
                   l a y a o s ø
nr    tv tilst + * l t t s n v d - type   id1      id2      ttmm/ant -ej.op:>,
<*
01 ..... ..... x x x x x x x x x x .... ........ ........   .... ....  ----
*>
        "nl",1);
      for i:=1 step 1 until max_antal_kanaler do
      begin
        ref:=(i-1)*kanal_beskr_længde;
        t:=kanal_tab.ref.kanal_tilstand;
        id1:=kanal_tab.ref.kanal_id1;
        id2:=kanal_tab.ref.kanal_id2;
        write(z,"nl",1,"sp",4,
          <<dd>,i,<<-ddddd>,t shift(-16),t shift(-12) extract 4,"sp",1);
        for j:=11 step -1 until 2 do
          write(z,if læsbit_i(t,j) then "X" else "sp",1,"sp",1);
        write(z,case t extract 2 +1 of
             (<:-   :>,<:OPK :>,<:MEDD:>,<:GNM :>),
          "sp",1);
        skriv_id(z,id1,9);
        skriv_id(z,id2,9);
        t:=kanal_tab.ref.kanal_spec;
        write(z,"sp",1,<<-dddd>,t,t shift(-16),"sp",1,-(t extract 8));
        write(z,"nl",1,"sp",14,<:mon: :>);
        for j:= max_antal_taleveje step -1 until 1 do
          write(z,(if læs_bit_ia(kanal_tab.ref.kanal_mon_maske,j) then "1"
                else "."),1);
        write(z,"sp",25-max_antal_taleveje);
        skriv_id(z,kanal_tab.ref.kanal_alt_id1,9);
        skriv_id(z,kanal_tab.ref.kanal_alt_id2,9);
      end;
      write(z,"nl",2,<:kanalflag::>,"nl",1);
      outintbits_ia(z,kanalflag,1,op_maske_lgd//2);
      write(z,"nl",2);
    end skriv_kanal_tab;
\f

message procedure skriv_opkaldskø side 1 - 820301/hko;

  procedure skriv_opkaldskø(z);
    zone                    z;
    begin
      integer i,bogst,løb,j;
      integer array field ref;
      write(z,"nl",2,"*",5,<: opkaldskø :>,"*",5,"nl",2,
        <:  ref næste foreg X    bus  linie/løb tid   -  op type  :>,
        <: sig omr :>,"nl",1);
      for i:= 1 step 1 until max_antal_mobilopkald do
      begin
        ref:= i*opkaldskø_postlængde;
        j:= opkaldskø.ref(1);
        write(z,<< dddd>,ref,<< ddddd>,j extract 12,j shift (-12));
        j:= opkaldskø.ref(2);
        write(z,"sp",1,if j < 0 then "X" else "sp",1,"sp",1);
        skriv_id(z,j extract 23,9);
        j:= opkaldskø.ref(3);
        skriv_id(z,j,7);
        j:= opkaldskø.ref(4);
        write(z,<<  zd.dd>,(j shift (-12))/100.0,
          <<    zd>,j extract 8);
        j:= j shift (-8) extract 4;
        if j = 1 or j = 2 then
          write(z,if j=1 then <: normal:> else <: nød   :>)
        else write(z,<<dddd>,j,"sp",3);
        j:= opkaldskø.ref(5);
        write(z,if j shift (-20) <> 0 then <:  B  :> else <:  S  :>,
          true,4,if 1<=(j extract 8) and (j extract 8)<=max_antal_områder then
          string område_navn(j extract 8) else <:---:>);
        outchar(z,'nl');
      end;

      write(z,"nl",1,<<z>,
        <:første_frie_opkald=:>,første_frie_opkald,"nl",1,
        <:første_opkald=:>,første_opkald,"nl",1,
        <:sidste_opkald=:>,sidste_opkald,"nl",1,
        <:første_nødopkald=:>,første_nødopkald,"nl",1,
        <:sidste_nødopkald=:>,sidste_nødopkald,"nl",1,
        <:opkaldskø_ledige=:>,opkaldskø_ledige,"nl",1,
        <:nødopkald_brugt= :>,nødopkald_brugt,"nl",1,
        "nl",1,<:opkaldsflag::>,"nl",1);
        outintbits_ia(z,opkaldsflag,1,op_maske_lgd//2);
        write(z,"nl",2);
    end skriv_opkaldskø;
\f

message procedure skriv_radio_linietabel side 1 - 820301/hko;

  procedure skriv_radio_linie_tabel(z);
    zone                               z;
    begin
      integer i,j,k;

      write(z,"nl",2,"*",5,<: liniefordeling for operatører :>,"*",5,"nl",2);
      k:= 0;
      for i:= 1 step 1 until max_linienr do
      begin
        læstegn(radio_linietabel,i+1,j);
        if j > 0 then
        begin
          k:= k +1;
          write(z,<<dddd>,i,":",1,<<zd_>,j,"sp",if k mod 5=0 then 0 else 4,
            "nl",if k mod 5=0 then 1 else 0);
        end;
      end;
      write(z,"nl",if k mod 5=0 then 1 else 2);
    end skriv_radio_linietabel;

procedure skriv_radio_områdetabel(z);
 zone                             z;
  begin
    integer i;

    write(z,"nl",2,"*",5,<: områdefordeling for operatører :>,"*",5,"nl",2);
    for i:= 1 step 1 until max_antal_områder do
    begin
      laf:= (i-1)*4;
      if radio_områdetabel(i)<>0 then
        write(z,<<dd>,i,<:. :>,områdenavn.laf,<:: :>,
          radio_områdetabel(i),"nl",1);
    end;
  end skriv_radio_områdetabel;
\f

message procedure h_radio side 1 - 810520/hko;

  <* hovedmodulkorutine for radiokanaler *>
  procedure h_radio;
  begin
    integer array field op_ref;
    integer k,dest_sem;
    procedure skriv_hradio(z,omfang);
      value                  omfang;
      zone                 z;
      integer                omfang;
      begin integer i;
        disable i:= write(z,"nl",1,<:+++ hovedmodul radio:>);
        write(z,"sp",26-i);
        if omfang >0 then
        disable begin integer x;
          trap(slut);
          write(z,"nl",1,
            <:  op_ref:    :>,op_ref,"nl",1,
            <:  k:         :>,k,"nl",1,
            <:  dest_sem:  :>,dest_sem,"nl",1,
            <::>);
          skriv_coru(z,coru_no(400));
slut:
        end;
      end skriv_hradio;

  trap(hrad_trap);
  stack_claim(if cm_test then 198 else 146);

<*+2*> if testbit32 and overvåget or testbit28 then
    skriv_hradio(out,0);
<*-2*>
\f

message procedure h_radio side 2 - 820304/hko;

  repeat
    wait_ch(cs_rad,op_ref,true,-1);
<*+2*>if testbit33 and overvåget then
      disable begin
        skriv_h_radio(out,0);
        write(out,<: operation modtaget:>);
        skriv_op(out,op_ref);
      end;
<*-2*>
<*+4*>
    if (d.op_ref.optype and
         (gen_optype or rad_optype or vt_optype)) extract 12 =0
    then fejlreaktion(12<*operationstype*>,op_ref,<:h<'_'>radio:>,1);
<*-4*>

    k:=d.op_ref.op_kode extract 12;
    dest_sem:=
      if k > 0 and k < 7
         or k=11 or k=12 or k=19
         or (72<=k and k<=74) or k = 77
         <*IN,O/EK,O/IN,R/EK,R/FO,L/ST/EK,K/IN,K/RA,I/FO,O*>
      then cs_radio_adm
      else if k=41 <* radiokommando fra operatør *>
      then cs_radio(d.opref.data(1)) else -1;
<*+4*>
    if dest_sem<1 then
    begin
      if dest_sem<0 then
        fejlreaktion(2<*operationskode*>,k,<:hovedmodul radio:>,1);
      d.op_ref.resultat:= if dest_sem=0 then 45 else 31;
      signal_ch(d.op_ref.retur,op_ref,d.op_ref.optype);
    end
    else
<*-4*>
    begin <* operationskode ok *>
      signal_ch(dest_sem,op_ref,d.op_ref.optype);
    end;
  until false;

hrad_trap:
  disable skriv_hradio(zbillede,1);
  end h_radio;
\f

message procedure radio side 1 - 820301/hko;

  procedure radio(talevej,op);
  value           talevej,op;
  integer         talevej,op;
    begin
      integer array field opref, rad_op, vt_op, opref1, iaf, iaf1;
      integer nr,i,j,k,res,opgave,tilst,tekn_inf, vtop2, vtop3,
              sig,omr,type,bus,ll,ttmm,vogn,garage,operatør;
      integer array felt,værdi(1:8);
      boolean byt,nød,frigiv_samtale;
      real kl;
      real field rf;

      procedure skriv_radio(z,omfang);
        value                 omfang;
        zone                z;
        integer               omfang;
        begin integer i1;
          disable i1:= write(z,"nl",1,<:+++ radio:>);
          write(z,"sp",26-i1);
          if omfang > 0 then
          disable begin real x;
            trap(slut);
\f

message procedure radio side 1a- 820301/hko;

            write(z,"nl",1,
              <:  op_ref:    :>,op_ref,"nl",1,
              <:  opref1:    :>,opref1,"nl",1,
              <:  iaf:       :>,iaf,"nl",1,
              <:  iaf1:      :>,iaf1,"nl",1,
              <:  vt-op:     :>,vt_op,"nl",1,
              <:  rad-op:    :>,rad_op,"nl",1,
              <:  rf:        :>,rf,"nl",1,
              <:  nr:        :>,nr,"nl",1,
              <:  i:         :>,i,"nl",1,
              <:  j:         :>,j,"nl",1,
              <:  k:         :>,k,"nl",1,
              <:  operatør:  :>,operatør,"nl",1,
              <:  tilst:     :>,tilst,"nl",1,
              <:  res:       :>,res,"nl",1,
              <:  opgave:    :>,opgave,"nl",1,
              <:  type:      :>,type,"nl",1,
              <:  bus:       :>,bus,"nl",1,
              <:  ll:        :>,ll,"nl",1,
              <:  ttmm:      :>,ttmm,"nl",1,
              <:  vogn:      :>,vogn,"nl",1,
              <:  tekn-inf:  :>,tekn_inf,"nl",1,
              <:  vtop2:     :>,vtop2,"nl",1,
              <:  vtop3:     :>,vtop3,"nl",1,
              <:  sig:       :>,sig,"nl",1,
              <:  omr:       :>,omr,"nl",1,
              <:  garage:    :>,garage,"nl",1,
              <<-dddddd'-dd>,
              <:  kl:        :>,kl,systime(4,kl,x),x,"nl",1,
              <:samtaleflag: :>,"nl",1);
            out_intbits_ia(z,samtaleflag,1,op_maske_lgd//2);
            skriv_coru(z,coru_no(410+talevej));
slut:
          end;<*disable*>
        end skriv_radio;
\f

message procedure udtag_opkald side 1 - 820301/hko;

  integer
  procedure udtag_opkald(vogn,type,operatør,bus,garage,omr,sig,ll,ttmm);
    value                vogn,     operatør;
    integer              vogn,type,operatør,bus,garage,omr,sig,ll,ttmm;
    begin
      integer res,tilst,nr,i,j,t,o,b,l,tm;
      integer array field vt_op,ref,næste,forrige;
      integer array field iaf1;
      boolean skal_ud;

      boolean procedure skal_udskrives(fordelt,aktuel);
        value                          fordelt,aktuel;
        integer                        fordelt,aktuel;
      begin
        boolean skal;
        integer n;
        integer array field iaf;

        skal:= true;
        if fordelt > 0 and fordelt<>aktuel then
        begin
          for n:= 0 step 1 until 3 do
          begin
            if bpl_tilst(operatør_stop(fordelt,n),1) > 0 then
            begin
              iaf:= operatør_stop(fordelt,n)*op_maske_lgd;
              skal:= læsbit_ia(bpl_def.iaf,aktuel);
              goto returner;
            end;
          end;
        end;
returner:
        skal_udskrives:= skal;
      end;

      l:= b:= tm:= t:= 0;
      garage:= sig:= 0;
      res:= -1;
<*V*> wait(bs_opkaldskø_adgang);
      ref:= første_nødopkald;
      if ref <> 0 then
        t:= 2
      else
      begin
        ref:= første_opkald;
        t:= if ref = 0 then 0 else 1;
      end;
      if t = 0 then res:= +19 <*kø er tom*> else
      if vogn=0 and omr=0 then
      begin
        while ref <> 0 and res = -1 do
        begin
          nr:= opkaldskø.ref(4) extract 8;
          if nr>64 then
          begin 
            <*opk. primærfordelt til gruppe af btj.pl.*>
            i:=0; skal_ud:=true; iaf1:=nr*op_maske_lgd;
            while skal_ud and i<max_antal_operatører do
            begin
              i:=i+1;
              if læsbit_ia(bpl_def.iaf1,i) then
                skal_ud:= skal_ud and skal_udskrives(i,operatør);
            end;
          end
          else
            skal_ud:= skal_udskrives(nr,operatør);

          if skal_ud then
<*        if nr=0 or -,læsbit_ia(operatørmaske,nr) or nr=operatør then
*>
            res:= 0
          else
          begin
            ref:= opkaldskø.ref(1) extract 12;
            if ref = 0 and t = 2 then
            begin
              ref:= første_opkald;
              t:= if ref = 0 then 0 else 1;
            end else if ref = 0 then t:= 0;
          end;
        end; <*while*>
\f

message procedure udtag_opkald side 2 - 820304/hko;

        if ref <> 0 then
        begin
          b:= opkaldskø.ref(2);
<*+4*>    if b < 0 then
            fejlreaktion(19<*mobilopkald*>,bus extract 14,
              <:nødopkald(besvaret/ej meldt):>,1);
<*-4*>
          garage:=b shift(-14) extract 8;
          b:= b extract 14;
          l:= opkaldskø.ref(3);
          tm:= opkaldskø.ref(4);
          o:= tm extract 8;
          tm:= tm shift(-12);
          omr:= opkaldskø.ref(5) extract 8;
          sig:= opkaldskø.ref(5) shift (-20);
        end
        else res:=19; <* kø er tom *>
      end <*vogn=0 and omr=0 *>
      else
      begin
        <* vogn<>0 or omr<>0 *>
        i:= 0; tilst:= -1;
        if vogn shift(-22) = 1 then
        begin
          i:= find_busnr(vogn,nr,garage,tilst);
          l:= vogn;
        end
        else
        if vogn<>0 and (omr=0 or omr>2) then
        begin
          o:= 0;
          i:= søg_omr_bus(vogn,l,garage,o,sig,tilst);
          if i=(-2) then
          begin
            o:= omr;
            i:= søg_omr_bus(vogn,l,garage,o,sig,tilst);
          end;
          nr:= vogn extract 14;
        end
        else nr:= vogn extract 14;
        if i<0 then ref:= 0;
        while ref <> 0 and res = -1 do
        begin
          i:= opkaldskø.ref(2) extract 14;
          j:= opkaldskø.ref(4) extract 8; <*operatør*>
          if nr = i and
             (omr=0 or omr=opkaldskø.ref(5) extract 8) then res:= 0
          else
          begin
            ref:= opkaldskø.ref(1) extract 12;
            if ref = 0 and t = 2 then
            begin
              ref:= første_opkald;
              t:= if ref = 0 then 0 else 1;
            end else if ref = 0 then t:= 0;
          end;
        end; <*while*>
\f

message procedure udtag_opkald side 3 - 810603/hko;

        if ref <> 0 then
        begin
          b:= nr;
          tm:= opkaldskø.ref(4);
          o:= tm extract 8;
          tm:= tm shift(-12);
          omr:= opkaldskø.ref(5) extract 4;
          sig:= opkaldskø.ref(5) shift (-20);

<*+4*>    if tilst <> -1 then
            fejlreaktion(3<*prg.fejl*>,tilst,
              <:vogntabel_tilstand for vogn i kø:>,1);
<*-4*>
        end;
      end;

      if ref <> 0 then
      begin
        næste:= opkaldskø.ref(1);
        forrige:= næste shift(-12);
        næste:= næste extract 12;
        if forrige <> 0 then
          opkaldskø.forrige(1):= opkaldskø.forrige(1) shift(-12) shift 12
                                 + næste
        else if t = 1 then første_opkald:= næste
        else <*if t = 2 then*> første_nødopkald:= næste;

        if næste <> 0 then
          opkaldskø.næste(1):= opkaldskø.næste(1) extract 12
                               + forrige shift 12
        else if t = 1 then sidste_opkald:= forrige
        else <* if t = 2 then*> sidste_nødopkald:= forrige;

        opkaldskø.ref(1):=første_frie_opkald;
        første_frie_opkald:=ref;

        opkaldskø_ledige:=opkaldskø_ledige + 1;
        if t=2 then nødopkald_brugt:=nødopkald_brugt - 1;
        if -,læsbit_ia(operatør_maske,o) or o = 0 then
          tofrom(opkaldsflag,alle_operatører,op_maske_lgd)
        else
        begin
          sætbit_ia(opkaldsflag,operatør,1);
          sætbit_ia(opkaldsflag,o,1);
        end;
        signal_bin(bs_mobil_opkald);
      end;
\f

message procedure udtag_opkald side 4 - 810531/hko;

      signal_bin(bs_opkaldskø_adgang);
      bus:= b;
      type:= t;
      ll:= l;
      ttmm:= tm;
      udtag_opkald:= res;
    end udtag opkald;
\f

message procedure frigiv_kanal side 1 - 810603/hko;

  procedure frigiv_kanal(nr);
    value                nr;
    integer              nr;
    begin
      integer id1, id2, omr, i;
      integer array field iaf, vt_op;

      iaf:= (nr-1)*kanal_beskrlængde;
      id1:= kanal_tab.iaf.kanal_id1;
      id2:= kanal_tab.iaf.kanal_id2;
      omr:= kanal_til_omr(nr);
      if id1 <> 0 then
        wait(ss_samtale_nedlagt(nr));
      if id1 shift (-22) < 3 and omr > 2 then
      begin
<*V*>   waitch(cs_vt_adgang,vt_op,true,-1);
        start_operation(vt_op,410+talevej,cs_radio(talevej),
          if id1 shift (-22) = 2 then 18 else 17);
        d.vt_op.data(1):= id1;
        d.vt_op.data(4):= omr;
        signalch(cs_vt,vt_op,vt_optype or genoptype);
<*V*>   waitch(cs_radio(talevej),vt_op,vt_optype,-1);
        signalch(cs_vt_adgang,vt_op,true);
      end;

      if id2 <> 0 and id2 shift(-20) <> 12 then
        wait(ss_samtale_nedlagt(nr));
      if id2 shift (-22) < 3 and omr > 2 then
      begin
<*V*>   waitch(cs_vt_adgang,vt_op,true,-1);
        start_operation(vt_op,410+talevej,cs_radio(talevej),
          if id2 shift (-22) = 2 then 18 else 17);
        d.vt_op.data(1):= id2;
        d.vt_op.data(4):= omr;
        signalch(cs_vt,vt_op,vt_optype or genoptype);
<*V*>   waitch(cs_radio(talevej),vt_op,vt_optype,-1);
        signalch(cs_vt_adgang,vt_op,true);
      end;

      kanal_tab.iaf.kanal_id1:= kanal_tab.iaf.kanal_id2:= 
      kanal_tab.iaf.kanal_alt_id1:= kanal_tab.iaf.kanal_alt_id2:= 0;
      kanal_tab.iaf.kanal_tilstand:= kanal_tab.iaf.kanal_tilstand
                                    shift (-10) extract 6 shift 10;
<*    repeat
        inspect(ss_samtale_nedlagt(nr),i);
        if i>0 then wait(ss_samtale_nedlagt(nr));
      until i<=0;
*>
    end frigiv_kanal;
\f

message procedure hookoff side 1 - 880901/cl;

integer procedure hookoff(talevej,op,retursem,flash);
value                     talevej,op,retursem,flash;
integer                   talevej,op,retursem;
boolean                                        flash;
begin
  integer array field opref;

  opref:= op;
  start_operation(opref,410+talevej,retursem,'A' shift 12 + 60);
  d.opref.data(1):= talevej;
  d.opref.data(2):= if flash then 2 else 1;
  signalch(cs_radio_ud,opref,rad_optype);
<*V*> waitch(retursem,opref,rad_optype,-1);
  hookoff:= d.opref.resultat;
end;
\f

message procedure hookon side 1 - 880901/cl;

integer procedure hookon(talevej,op,retursem);
  value                  talevej,op,retursem;
  integer                talevej,op,retursem;
begin
  integer i,res;
  integer array field opref;

 if læsbit_ia(hookoff_maske,talevej) then
 begin
  inspect(bs_talevej_udkoblet(talevej),i);
  if i<=0 then
  begin
    opref:= op;
    start_operation(opref,410+talevej,retursem,'D' shift 12 + 60);
    d.opref.data(1):= talevej;
    signalch(cs_radio_ud,opref,rad_optype);
<*V*> waitch(retursem,opref,rad_optype,-1);
    res:= d.opref.resultat;
  end
  else
    res:= 0;

  if res=0 then wait(bs_talevej_udkoblet(talevej));
 end
 else
   res:= 0;

 sætbit_ia(hookoff_maske,talevej,0);
  hookon:= res;
end;
\f

message procedure radio side 2 - 820304/hko;

      rad_op:= op;

      trap(radio_trap);
      stack_claim((if cm_test then 200 else 150) +200);

<*+2*>if testbit32 and overvåget or testbit28 then
        skriv_radio(out,0);
<*-2*>
      repeat
        waitch(cs_radio(talevej),opref,true,-1);
<*+2*>
        if testbit33 and overvåget then
        disable begin
          skriv_radio(out,0);
          write(out,<: operation modtaget på cs:>,<<d>,cs_radio(talevej));
          skriv_op(out,opref);
        end;
<*-2*>

        k:= d.op_ref.opkode extract 12;
        opgave:= d.opref.opkode shift (-12);
        operatør:= d.op_ref.data(4);

<*+4*>  if (d.op_ref.optype and (gen_optype or io_optype or op_optype))
          extract 12 = 0 then fejlreaktion(12<*operationstype*>,op_ref,
                                <:radio:>,0);
<*-4*>
\f

message procedure radio side 3 - 880930/cl;
        if k=41 <*radiokommando fra operatør*> then
        begin
          vogn:= d.opref.data(2);
          res:= -1;
          for i:= 7 step 1 until 12 do d.opref.data(i):= 0;
          sig:= 0; omr:= d.opref.data(3) extract 8;
          bus:= garage:= ll:= 0;

          if opgave=1 or opgave=9 then
          begin <* opkald til enkelt vogn (CHF) *>
            res:= udtag_opkald(vogn,type,operatør,bus,garage,omr,sig,ll,ttmm);
            if res=19 and (vogn<>0 or d.opref.data(3)=2) then res:= -1;
            <* ok at kø er tom når vogn er angivet eller VHF *>
            
            d.opref.data(11):= if res=0 then 
              (if ll<>0 then ll else bus) else vogn;

            if type=2 <*nød*> then
            begin
              waitch(cs_radio_pulje,opref1,true,-1);
              start_operation(opref1,410+talevej,cs_radio_pulje,46);
              d.opref1.data(1):= if ll<>0 then ll else bus;
              systime(5,0,kl);
              d.opref1.data(2):= entier(kl/100.0);
              d.opref1.data(3):= omr;
              signalch(cs_io,opref1,gen_optype or rad_optype);
            end
          end; <* enkeltvogn (CHF) *>

          <* check enkeltvogn for ledig *>
          if res<=0 and omr=2<*VHF*> and bus=0 and
             (opgave=1 or opgave=9) then
          begin
            for i:= 1 step 1 until max_antal_kanaler do
              if kanal_til_omr(i)=2 then nr:= i;
            iaf:= (nr-1)*kanalbeskrlængde;
            if kanal_tab.iaf.kanal_tilstand extract 2<>0 and 
               kanal_tab.iaf.kanal_id1 extract 20 = 10000
            then res:= 52;
          end;
          if res < 0 and (d.opref.data(3) > 2 <* ej TLF, VHF *> or
            d.opref.data(3)=0 <*std. omr*>) and
            (opgave <= 2 <* OP elller ME *> or opgave = 9 <* OP,L *>)
          then
          begin
            type:= ttmm:= 0; omr:= 0; sig:= 0;
            if vogn shift (-22) = 1 then
            begin
              find_busnr(vogn,bus,garage,res);
              ll:= vogn;
            end
            else
            if vogn shift (-22) = 0 then
            begin
              søg_omr_bus(vogn,ll,garage,omr,sig,res);
              bus:= vogn;
            end
            else
              fejlreaktion(31,vogn,<:vognident i enkeltvognsopk.:>,0);
            res:= if res=(-1) then 18 <* i kø *> else 
                  (if res<>0 then 14 <*opt*> else 0);
          end
          else
          if res<0 and (d.opref.data(3)=1 or d.opref.data(3)=2) and
            opgave <= 2 then
          begin
            bus:= vogn; garage:= type:= ttmm:= 0;
            res:= 0; omr:= 0; sig:= 0;
          end
          else
          if opgave>1 and opgave<>9 then
            type:= ttmm:= res:= 0;
\f

message procedure radio side 4 - 880930/cl;

          if res=0 and (opgave<=4 or opgave=9) and
            (omr<1 or 2<omr) and
            (d.opref.data(3)>2 or d.opref.data(3)=0) then
          begin <* reserver i vogntabel *>
            waitch(cs_vt_adgang,vt_op,true,-1);
            start_operation(vt_op,410+talevej,cs_radio(talevej),
              if opgave <=2 or opgave=9 then 15 else 16);
            d.vt_op.data(1):= if opgave<=2 or opgave=9 then
              (if vogn=0 then garage shift 14 + bus else 
               if ll<>0 then ll else garage shift 14 + bus)
              else vogn <*gruppeid*>;
            d.vt_op.data(4):= if d.opref.data(3)<>0 then
                                d.opref.data(3) extract 8
                              else omr extract 8;
            signalch(cs_vt,vt_op,gen_optype or rad_optype);
<*V*>       waitch(cs_radio(talevej),vt_op,rad_optype,-1);

            res:= d.vt_op.resultat;
            if res=3 then res:= 0;
            vtop2:= d.vt_op.data(2);
            vtop3:= d.vt_op.data(3);
            tekn_inf:= d.vt_op.data(4);
            signalch(cs_vt_adgang,vt_op,gen_optype or vt_optype);
          end;

          if res<>0 then
          begin
            d.opref.resultat:= res;
            signalch(d.opref.retur,opref,d.opref.optype);
          end
          else

          if opgave <= 9 then
          begin <* opkald *>
            res:= hookoff(talevej,rad_op,cs_radio(talevej),
                opgave<>9 and d.opref.data(6)<>0);

            if res<>0 then
              goto returner_op;

            if opgave=7 or opgave=8 then <* KATASTROFEOPKALD *>
            begin
              start_operation(rad_op,410+talevej,cs_radio(talevej),
                'H' shift 12 + 60);
              d.rad_op.data(1):= talevej;
              d.rad_op.data(2):= 'D';
              d.rad_op.data(3):= 6; <* rear *>
              d.rad_op.data(4):= 1; <* rear no *>
              d.rad_op.data(5):= 0; <* disconnect *>
              signalch(cs_radio_ud,rad_op,rad_optype);
<*V*>         waitch(cs_radio(talevej),rad_op,rad_optype,-1);
              if d.rad_op.resultat<>0 then
              begin
                res:= d.rad_op.resultat;
                goto returner_op;
              end;
<*
              while optaget_flag shift (-1) <> 0 do
                delay(1);
*>
            end;
\f

message procedure radio side 5 - 880930/cl;

            start_operation(rad_op,410+talevej,cs_radio(talevej),
              'B' shift 12 + 60);
            d.rad_op.data(1):= talevej;
            d.rad_op.data(2):= 'D';
            d.rad_op.data(3):= if opgave=9 then 3 else
                               (2 - (opgave extract 1)); <* højttalerkode *>

            if 5<=opgave and opgave <=8 then <* ALLE KALD *>
            begin
              j:= 0;
              for i:= 2 step 1 until max_antal_områder do
              begin
                if opgave > 6 or
                  (d.opref.data(3) shift (-20) = 15 and
                   læsbiti(d.opref.data(3),i)) or
                  (d.opref.data(3) shift (-20) = 14 and
                   d.opref.data(3) extract 20  =  i)
                then
                begin
                  for k:= 1 step 1 until (if i=3 then 2 else 1) do
                  begin
                    j:= j+1;
                    d.rad_op.data(10+(j-1)*2):=
                      område_id(i,2) shift 12 +         <* tkt, tkn *>
                      (if i=2<*VHF*> then 4 else k) 
                                           shift 8 +   <* signal type *>
                                                  1;    <* antal tno *>
                    d.rad_op.data(11+(j-1)*2):= 0;      <* tno alle *>
                  end;
                end;
              end;
              d.rad_op.data(4):= j;
              d.rad_op.data(5):= 0;
            end
            else
            if opgave>2 and opgave <= 4 then <* gruppekald *>
            begin
              d.rad_op.data(4):= vtop2;
              d.rad_op.data(5):= vtop3;
            end
            else
            begin <* enkeltvogn *>
              if omr=0 then
              begin
                sig:= tekn_inf shift (-23);
                omr:= if d.opref.data(3)<>0 then d.opref.data(3)
                      else tekn_inf extract 8;
              end
              else
              if d.opref.data(3)<>0 then omr:= d.opref.data(3);

              <* lytte-kald til nød i TCT, VHF og TLF *>
              <* tvinges til alm. opkald              *>
              if (opgave=9) and (type=2) and (omr<=3) then
              begin
                d.opref.opkode:= 1 shift 12 + d.opref.opkode extract 12;
                opgave:= 1;
                d.radop.data(3):= 1;
              end;

              if omr=2 <*VHF*> then sig:= 4 else
              if omr=1 <*TLF*> then sig:= 7 else
                       <*UHF*>      sig:= sig+1;
              d.rad_op.data(4):= 1;
              d.rad_op.data(5):= 0;
              d.rad_op.data(10):=
                 (område_id(omr,2) extract 12) shift 12  +
                                  sig shift 8 +
                                  1;
              d.rad_op.data(11):= bus;
            end;
\f

message procedure radio side 6 - 880930/cl;

            signalch(cs_radio_ud,rad_op,rad_optype);
<*V*>       waitch(cs_radio(talevej),rad_op,rad_optype,-1);
            res:= d.rad_op.resultat;

            d.rad_op.data(6):= 0;
            for i:= 1 step 1 until max_antal_områder do
              if læsbiti(d.rad_op.data(7),i) then 
                increase(d.rad_op.data(6));
returner_op:
            if d.rad_op.data(6)=1 then
            begin
              for i:= 1 step 1 until max_antal_områder do
                if d.rad_op.data(7) extract 20 = 1 shift i then
                  d.opref.data(12):= 14 shift 20 + i;
            end
            else
              d.opref.data(12):= 15 shift 20 + d.rad_op.data(7) extract 20;
            d.opref.data(7):= type;
            d.opref.data(8):= garage shift 14 + bus;
            d.opref.data(9):= ll;
            if res=0 then
            begin
              d.opref.resultat:= 3;
              d.opref.data(5):= d.opref.data(6);
              j:= 0;
              for i:= 1 step 1 until max_antal_kanaler do
                if læsbiti(d.rad_op.data(9),i) then j:= j+1;
              if j>1 then
                d.opref.data(6):= 3 shift 22 + 1 shift 20 + d.rad_op.data(9)
              else
              begin
                j:= 0;
                for i:= 1 step 1 until max_antal_kanaler do
                  if læsbiti(d.rad_op.data(9),i) then j:= i;
                d.opref.data(6):= 3 shift 22 + j;
              end;
              d.opref.data(7):= type;
              d.opref.data(8):= garage shift 14 + bus;
              d.opref.data(9):= ll;
              d.opref.data(10):= d.opref.data(6);
              for i:= 1 step 1 until max_antal_kanaler do
              begin
                if læsbiti(d.rad_op.data(9),i) then
                begin
                  if kanal_id(i) shift (-5) extract 5 = 2 then
                    j:= pabx_id( kanal_id(i) extract 5 )
                  else
                    j:= radio_id( kanal_id(i) extract 5 );
                  if j>0 and type=0 and operatør>0 then tæl_opkald(j,1);

                  iaf:= (i-1)*kanalbeskrlængde;
                  skrivtegn(kanal_tab.iaf,1,talevej);
                  kanal_tab.iaf.kanal_id2:= kanal_tab.iaf.kanal_id1;
                  kanal_tab.iaf.kanal_alt_id2:= kanal_tab.iaf.kanal_alt_id1;
                  kanal_tab.iaf.kanal_id1:=
                    if opgave<=2 or opgave=9 then
                      d.opref.data(if d.opref.data(9)<>0 then 9 else 8)
                    else
                      d.opref.data(2);
                  kanal_tab.iaf.kanal_alt_id1:=
                    if opgave<=2 or opgave=9 then
                      d.opref.data(if d.opref.data(9)<>0 then 8 else 9)
                    else
                      0;
                  if kanal_tab.iaf.kanal_id1=0 then
                    kanal_tab.iaf.kanal_id1:= 10000;
                  kanal_tab.iaf.kanal_spec:=
                     if opgave <= 2 or opgave = 9 then ttmm else 0;
                end;
              end;
              if 5<=opgave and opgave<=8 <*alle-/katastrofekald*> then
                sætbit_ia(kanalflag,operatør,1);
\f

message procedure radio side 7 - 880930/cl;

            end
            else
            begin
              d.opref.resultat:= res;
              if res=20 or res=52 then
              begin <* tæl ej.forb og opt.kanal *>
                for i:= 1 step 1 until max_antal_områder do
                  if læsbiti(d.rad_op.data(7),i) then
                    tæl_opkald(i,(if res=20 then 4 else 5));
              end;
              if d.opref.data(6)=0 then
              res:= hookon(talevej,rad_op,cs_radio(talevej));
              <* frigiv fra vogntabel hvis reserveret *>
              if (opgave<=4 or opgave=9) and
                 (d.opref.data(3)=0 or d.opref.data(3)>2) then
              begin
                waitch(cs_vt_adgang,vt_op,true,-1);
                startoperation(vt_op,410+talevej,cs_radio(talevej),
                  if opgave<=2 or opgave=9 then 17 else 18);
                d.vt_op.data(1):= if opgave<=2 or opgave=9 then
                  (if vogn=0 then garage shift 14 + bus else
                   if ll<>0 then ll else garage shift 14 + bus)
                  else vogn;
                d.vt_op.data(4):= omr;
                signalch(cs_vt,vt_op,gen_optype or vt_optype);
                waitch(cs_radio(talevej),vt_op,vt_optype,-1);
                signalch(cs_vt_adgang,vt_op,true);
              end;
            end;
            signalch(d.opref.retur,opref,d.opref.optype);
\f

message procedure radio side 8 - 880930/cl;

          end <* opkald *>
          else
          if opgave = 10 <* MONITER *> then
          begin
            nr:= d.opref.data(2);
            if nr shift (-20) <> 12 then 
              fejlreaktion(3,nr,<: moniter, kanalnr:>,0);
            nr:= nr extract 20;
            iaf:= (nr-1)*kanalbeskrlængde;
            inspect(ss_samtale_nedlagt(nr),i);
            k:= if kanal_tab.iaf.kanal_id2 shift (-20) = 12 then
                  kanal_tab.iaf.kanal_id2 extract 20
                else
                if kanal_tab.iaf.kanal_id2<>0 then nr else 0;
            if k<>0 then inspect(ss_samtale_nedlagt(k),j) else j:=0;
            if kanal_tab.iaf.kanal_tilstand shift (-16) = talevej and
               (i<>0 or j<>0) then
            begin
              res:= 0;
              d.opref.data(5):= 12 shift 20 + k;
              d.opref.data(6):= 12 shift 20 + nr;
              sætbit_ia(kanalflag,operatør,1);
              goto radio_nedlæg;
            end
            else
            if i<>0 or j<>0 then
              res:= 49
            else
            if kanal_tab.iaf.kanal_tilstand extract 2 = 0 then
              res:= 49 <* ingen samtale igang *>
            else
            begin
              res:= hookoff(talevej,rad_op,cs_radio(talevej),false);
              if res=0 then
              begin
                start_operation(rad_op,410+talevej,cs_radio(talevej),
                  'B' shift 12 + 60);
                d.rad_op.data(1):= talevej;
                d.rad_op.data(2):= 'V';
                d.rad_op.data(3):= 0;
                d.rad_op.data(4):= 1;
                d.rad_op.data(5):= 0;
                d.rad_op.data(10):=
                  (kanal_id(nr) shift (-5) shift 18) +
                  (kanal_id(nr) extract  5 shift 12) + 0;
                signalch(cs_radio_ud,rad_op,rad_optype);
<*V*>           waitch(cs_radio(talevej),rad_op,rad_optype,-1);
                res:= d.rad_op.resultat;
                if res=0 then
                begin
                  d.opref.data(5):= 0;
                  d.opref.data(6):= 3 shift 22 + 0 shift 20 + nr;
                  d.opref.data(7):= kanal_tab.iaf.kanal_tilstand extract 10;
                  res:= 3;
                end;
              end;
            end;
\f

message procedure radio side 9 - 880930/cl;
            if res=3 then
            begin
              if kanal_tab.iaf.kanal_tilstand shift (-16) = talevej then
                sætbiti(kanal_tab.iaf.kanal_tilstand,5,1) <* monbit *>
              else
                sætbit_ia(kanal_tab.iaf.kanal_mon_maske,talevej,1);
              d.opref.data(6):= 12 shift 20 + nr;
              i:= kanal_tab.iaf.kanal_id2;
              if i<>0 then
              begin
                if i shift (-20) = 12 then
                begin <* ident2 henviser til anden kanal *>
                  iaf1:= ((i extract 20)-1)*kanalbeskrlængde;
                  if kanal_tab.iaf1.kanal_tilstand shift (-16) = talevej then
                    sætbiti(kanal_tab.iaf.kanal_tilstand,5,1)
                  else
                    sætbit_ia(kanal_tab.iaf.kanal_mon_maske,talevej,1);
                  d.opref.data(5):= 12 shift 20 + i;
                end
                else
                  d.opref.data(5):= 12 shift 20 + nr;
              end
              else
                d.opref.data(5):= 0;
            end;

            if res<>3 then
            begin
              res:= 0;
              sætbit_ia(kanalflag,operatør,1);
              goto radio_nedlæg;
            end;
            d.opref.resultat:= res;
            signalch(d.opref.retur,opref,d.opref.optype);
\f

message procedure radio side 10 - 880930/cl;

          end <* MONITERING *>
          else
          if opgave = 11 then <* GENNEMSTILLING *>
          begin
            nr:= d.opref.data(6) extract 20;
            k:= if d.opref.data(5) shift (-20) = 12 then
                  d.opref.data(5) extract 20
                else
                  0;
            inspect(ss_samtale_nedlagt(nr),i);
            if k<>0 then inspect(ss_samtale_nedlagt(k),j) else j:=0;
            if i<>0 and j<>0 then
            begin
              res:= hookon(talevej,rad_op,cs_radio(talevej));
              goto radio_nedlæg;
            end;

            iaf:= (nr-1)*kanal_beskr_længde;
            if kanal_tab.iaf.kanal_tilstand shift (-16) = talevej then
            begin
              if læsbiti(kanal_tab.iaf.kanal_tilstand,5) and
                 kanal_tab.iaf.kanal_tilstand extract 2 = 3
              then
                res:= hookoff(talevej,rad_op,cs_radio(talevej),true)
              else
              if kanal_tab.iaf.kanal_tilstand extract 2 = 1 and
                 d.opref.data(5)<>0
              then
                res:= 0
              else
                res:= 21; <* ingen at gennemstille til *>
            end
            else
              res:= 50; <* kanalnr *>

            if res=0 then
              res:= hookon(talevej,rad_op,cs_radio(talevej));
            if res=0 then
            begin
              sætbiti(kanal_tab.iaf.kanal_tilstand,5,0);
              kanal_tab.iaf.kanal_tilstand:=
                kanal_tab.iaf.kanal_tilstand shift (-2) shift 2 + 3;
              d.opref.data(6):= 0;
              if kanal_tab.iaf.kanal_id2=0 then
                kanal_tab.iaf.kanal_id2:= d.opref.data(5);

              if kanal_tab.iaf.kanal_id2 shift (-22) = 3 then
              begin <* gennemstillet til anden kanal *>
                iaf1:= ((kanal_tab.iaf.kanal_id2 extract 20) - 1)
                                                        *kanalbeskrlængde;
                sætbiti(kanal_tab.iaf1.kanal_tilstand,5,0);
                kanal_tab.iaf1.kanal_tilstand:=
                  kanal_tab.iaf1.kanal_tilstand shift (-2) shift 2 + 3;
                if kanal_tab.iaf1.kanal_id2=0 then
                  kanal_tab.iaf1.kanal_id2:= 12 shift 20 + nr;
              end;
              d.opref.data(5):= 0;

              res:= 3;
            end;

            d.opref.resultat:= res;
            signalch(d.opref.retur,opref,d.opref.optype);
\f

message procedure radio side 11 - 880930/cl;

          end
          else
          if opgave = 12 then <* NEDLÆG *>
          begin
            res:= hookon(talevej,rad_op,cs_radio(talevej));
radio_nedlæg:
            if res=0 then
            begin
             for k:= 5, 6  do
             begin
              if d.opref.data(k) shift (-20) = 12 then
              begin
                i:= d.opref.data(k) extract 20;
                iaf:= (i-1)*kanalbeskrlængde;
                if kanal_tab.iaf.kanal_tilstand shift (-16) = talevej then
                  frigiv_kanal(d.opref.data(k) extract 20)
                else
                  sætbit_ia(kanal_tab.iaf.kanal_mon_maske,talevej,0);
              end
              else
              if d.opref.data(k) shift (-20) = 13 then
              begin
                for i:= 1 step 1 until max_antal_kanaler do
                  if læsbiti(d.opref.data(k),i) then
                  begin
                    iaf:= (i-1)*kanalbeskrlængde;
                    if kanal_tab.iaf.kanal_tilstand shift (-16) = talevej then
                      frigiv_kanal(i)
                    else
                      sætbit_ia(kanal_tab.iaf.kanal_mon_maske,talevej,0);
                  end;
                sætbit_ia(kanalflag,operatør,1);
              end;
             end;
              d.opref.data(5):= 0;
              d.opref.data(6):= 0;
              d.opref.data(9):= 0;
              res:= if opgave=12 then 3 else 49;
            end;
            d.opref.resultat:= res;
            signalch(d.opref.retur,opref,d.opref.optype);
          end
          else
          if opgave=13 then <* R *>
          begin
            startoperation(rad_op,410+talevej,cs_radio(talevej),
              'H' shift 12 + 60);
            d.rad_op.data(1):= talevej;
            d.rad_op.data(2):= 'M';
            d.rad_op.data(3):= 0; <*tkt*>
            d.rad_op.data(4):= 0; <*tkn*>
            d.rad_op.data(5):= 1 - (d.opref.data(2) extract 1);
            signalch(cs_radio_ud,rad_op,rad_optype);
<*V*>       waitch(cs_radio(talevej),rad_op,rad_optype,-1);
            res:= d.rad_op.resultat;
            d.opref.resultat:= if res=0 then 3 else res;
            signalch(d.opref.retur,opref,d.opref.optype);
          end
          else
          if opgave=14 <* VENTEPOS *> then
          begin
            res:= 0;
            while (res<=3 and d.opref.data(2)>0) do
            begin
              nr:= d.opref.data(6) extract 20;
              k:= if d.opref.data(5) shift (-20) = 12 then
                    d.opref.data(5) extract 20
                  else
                    0;
              inspect(ss_samtale_nedlagt(nr),i);
              if k<>0 then inspect(ss_samtale_nedlagt(k),j) else j:= 0;
              if i<>0 or j<>0 then
              begin
                res:= hookon(talevej,radop,cs_radio(talevej));
                goto radio_nedlæg;
              end;

              res:= hookoff(talevej,radop,cs_radio(talevej),true);

              if res=0 then
              begin
                i:= d.opref.data(5);
                d.opref.data(5):= d.opref.data(6);
                d.opref.data(6):= i;
                res:= 3;
              end;

              d.opref.data(2):= d.opref.data(2)-1;
            end;
            d.opref.resultat:= res;
            signalch(d.opref.retur,opref,d.opref.optype);
          end
          else
          begin
            fejlreaktion(2,opgave,<: radioopgave fra operatør:>,1);
            d.opref.resultat:= 31;
            signalch(d.opref.retur,opref,d.opref.optype);
          end;

        end <* radiokommando fra operatør *>
        else
        begin

          d.op_ref.resultat:= 45; <* ikke implementeret *>

          signal_ch(d.op_ref.retur,op_ref,d.op_ref.optype);

        end;
          
      until false;
radio_trap:
      disable skriv_radio(zbillede,1);
    end radio;
\f

message procedure radio_ind side 1 - 810521/hko;

  procedure radio_ind(op);
      value           op;
      integer         op;
    begin
      integer array field op_ref,ref,io_opref;
      integer ac, lgd, ttyp, ptyp, pnum, pos, tegn, bs, b_pt, b_pn,
        antal_sendt, antal_spec, sum, csum, i, j, k, filref, zno;
      integer array typ, val(1:6), answ, tlgr(1:32);
      integer array field spec;
      real field rf;
      long array field laf;

      procedure skriv_radio_ind(zud,omfang);
        value                       omfang;
        zone                    zud;
        integer                     omfang;
        begin integer ii;
          disable ii:=write(zud,"nl",1,<:+++ radio-ind ::>);
          if omfang > 0 then
          disable begin integer x; long array field tx;
            tx:= 0;
            trap(slut);
            write(zud,"nl",1,
              <:  op-ref:      :>,op_ref,"nl",1,
              <:  ref:         :>,ref,"nl",1,
              <:  io-opref:    :>,io_opref,"nl",1,
              <:  ac:          :>,ac,"nl",1,
              <:  lgd:         :>,lgd,"nl",1,
              <:  ttyp:        :>,ttyp,"nl",1,
              <:  ptyp:        :>,ptyp,"nl",1,
              <:  pnum:        :>,pnum,"nl",1,
              <:  pos:         :>,pos,"nl",1,
              <:  tegn:        :>,tegn,"nl",1,
              <:  bs:          :>,bs,"nl",1,
              <:  b-pt:        :>,b_pt,"nl",1,
              <:  b-pn:        :>,b_pn,"nl",1,
              <:  antal-sendt: :>,antal_sendt,"nl",1,
              <:  antal-spec:  :>,antal_spec,"nl",1,
              <:  sum:         :>,sum,"nl",1,
              <:  csum:        :>,csum,"nl",1,
              <:  i:           :>,i,"nl",1,
              <:  j:           :>,j,"nl",1,
              <:  k:           :>,k,"nl",1,
              <:  filref       :>,filref,"nl",1,
              <:  zno:         :>,zno,"nl",1,
              <:  answ:        :>,answ.tx,"nl",1,
              <:  tlgr:        :>,tlgr.tx,"nl",1,
              <:  spec:        :>,spec,"nl",1);
            trap(slut);
slut:
          end; <*disable*>
        end skriv_radio_ind;
\f

message procedure indsæt_opkald side 1 - 811105/hko;

  integer procedure indsæt_opkald(bus,type,omr,sig);
    value                         bus,type,omr,sig;
    integer                       bus,type,omr,sig;
    begin
      integer res,tilst,ll,operatør;
      integer array field vt_op,ref,næste,forrige;
      real r;

      res:= -1;
      begin
<*V*>   waitch(cs_vt_adgang,vt_op,true,if type=2 then -1 else 10);
        if vt_op <> 0 then
        begin
         wait(bs_opkaldskø_adgang);
         if omr>2 then
         begin
          start_operation(vt_op,401,cs_radio_ind,14<*bus i kø*>);
          d.vt_op.data(1):= bus;
          d.vt_op.data(4):= omr;
          tilst:= vt_op;
          signal_ch(cs_vt,vt_op,gen_optype or vt_optype);
<*V*>     wait_ch(cs_radio_ind,vt_op,vt_optype,-1);
<*+4*>    if tilst <> vt_op then
            fejlreaktion(11<*fremmed post*>,vt_op,<:radio,indsæt opkald:>,0);
<*-4*>
<*+2*>    if testbit34 and overvåget then
          disable begin
            write(out,"nl",1,<:radio_ind,indsæt.reservation retur:>);
            skriv_op(out,vt_op);
            ud;
          end;
         end
         else
         begin
           d.vt_op.data(1):= bus;
           d.vt_op.data(2):= 0;
           d.vt_op.data(3):= bus;
           d.vt_op.data(4):= omr;
           d.vt_op.resultat:= 0;
           ref:= første_nødopkald;
           if ref<>0 then tilst:= 2
           else
           begin
             ref:= første_opkald;
             tilst:= if ref=0 then 0 else 1;
           end;
           if tilst=0 then
             d.vt_op.resultat:= 3
           else
           begin
             while ref<>0 and d.vt_op.resultat=0 do
             begin
               if opkaldskø.ref(2) extract 14 = bus and
                  opkaldskø.ref(5) extract  8 = omr
               then
                 d.vt_op.resultat:= 18
               else
               begin
                 ref:= opkaldskø.ref(1) extract 12;
                 if ref=0 and tilst=2 then
                 begin
                   ref:= første_opkald;
                   tilst:= if ref=0 then 0 else 1;
                 end
                 else
                 if ref=0 then tilst:= 0;
               end;
             end;
             if d.vt_op.resultat=0 then d.vt_op.resultat:= 3;
           end;
         end;
<*-2*>
\f

message procedure indsæt_opkald side 1a- 820301/hko;

          if d.vt_op.resultat=18<*bus i kø*> and type=2<*nød*> then
          begin
            ref:=første_opkald;
            tilst:=-1;
            while ref<>0 and tilst=-1 do
            begin
              if opkaldskø.ref(2) extract 14 = bus extract 14 then
              begin <* udtag normalopkald *>
                næste:=opkaldskø.ref(1);
                forrige:=næste shift(-12);
                næste:=næste extract 12;
                if forrige<>0 then
                  opkaldskø.forrige(1):=
                    opkaldskø.forrige(1) shift(-12) shift 12 +næste
                else
                  første_opkald:=næste;
                if næste<>0 then
                  opkaldskø.næste(1):=
                    opkaldskø.næste(1) extract 12 + forrige shift 12
                else
                  sidste_opkald:=forrige;
                opkaldskø.ref(1):=første_frie_opkald;
                første_frie_opkald:=ref;
                opkaldskø_ledige:=opkaldskø_ledige +1;
                tilst:=0;
              end
              else
                ref:=opkaldskø.ref(1) extract 12;
            end; <*while*>
            if tilst=0 then
              d.vt_op.resultat:=3;
          end; <*nødopkald bus i kø*>
\f

message procedure indsæt_opkald side 2 - 820304/hko;

          if d.vt_op.resultat = 3 then
          begin
            ll:= d.vt_op.data(2);
            tilst:= d.vt_op.data(3);
            læstegn(radio_linietabel,(ll shift (-12) extract 10)+1,operatør);
            if operatør < 0 or max_antal_operatører < operatør then
              operatør:= 0;
            if operatør=0 then
              operatør:= (tilst shift (-14) extract 8);
            if operatør=0 then
              operatør:= radio_områdetabel(d.vt_op.data(4) extract 8);
            if operatør=0 or -,læsbit_ia(operatørmaske,operatør) then
              tofrom(opkaldsflag,alle_operatører,op_maske_lgd)
            else sæt_bit_ia(opkaldsflag,operatør,1);
            ref:= første_frie_opkald; <* forudsættes <> 0 *>
            første_frie_opkald:=opkaldskø.ref(1) extract 12; <*hægt ud*>
            forrige:= (if type = 1 then sidste_opkald
                                   else sidste_nødopkald);
            opkaldskø.ref(1):= forrige shift 12;
            if type = 1 then
            begin
              if første_opkald = 0 then første_opkald:= ref;
              sidste_opkald:= ref;
            end
            else
            begin <*type = 2*>
              if første_nødopkald = 0 then første_nødopkald:= ref;
              sidste_nødopkald:= ref;
            end;
            if forrige <> 0 then
              opkaldskø.forrige(1):= opkaldskø.forrige(1) shift (-12)
                                     shift 12 +ref;

            opkaldskø.ref(2):= tilst extract 22 add
                (if type=2 then 1 shift 23 else 0);
            opkaldskø.ref(3):= ll;
            systime(5,0.0,r);
            ll:= round r//100;<*ttmm*>
            opkaldskø.ref(4):= ll shift 12 +type shift 8 +operatør extract 8;
            opkaldskø.ref(5):= sig shift 20 + omr;
            tofrom(opkaldskø.ref.opkald_meldt,ingen_operatører,op_maske_lgd);
            res:= 0;
            if type=2 then nød_opkald_brugt:=nødopkald_brugt + 1;
            opkaldskø_ledige:= opkaldskø_ledige -1;
            <*meddel opkald til berørte operatører *>
            signal_bin(bs_mobil_opkald);
            tæl_opkald(omr,type+1);
          end <* resultat = 3 *>
          else
          begin
\f

message procedure indsæt_opkald side 3 - 810601/hko;

            <* d.vt_op.resultat <> 3 *>

            res:= d.vt_op.resultat;
            if res = 10 then
              fejlreaktion(20<*mobilopkald, bus *>,bus,
                <:er ikke i bustabel:>,1)
            else
<*+4*>      if res <> 14 and res <> 18 then
              fejlreaktion(19<*radio*>,res,<:busreservationsresultat:>,1);
<*-4*>
            ;
          end;
          signalbin(bs_opkaldskø_adgang);
          signal_ch(cs_vt_adgang,vt_op,gen_optype or vt_optype);
        end
        else
          res:= -2; <*timeout for cs_vt_adgang*>
      end;
      indsæt_opkald:= res;
    end indsæt_opkald;
\f

message procedure afvent_telegram side 1 - 880901/cl;

integer procedure afvent_telegram(tlgr,lgd,ttyp,ptyp,pnum);
  integer array                   tlgr;
  integer                              lgd,ttyp,ptyp,pnum;
begin
  integer i, pos, tegn, ac, sum, csum;

  pos:= 1;
  lgd:= 0;
  ttyp:= 'Z';
<*V*> ac:= afvent_radioinput(z_fr_in,tlgr,false);
  if ac >= 0 then
  begin
    lgd:= 1;
    while læstegn(tlgr,lgd,tegn)<>0 do ;
    lgd:= lgd-2;
    if lgd >= 3 then
    begin
      i:= 1;
      ttyp:= læstegn(tlgr,i,tegn);
      ptyp:= læstegn(tlgr,i,tegn) - '@';
      pnum:= læstegn(tlgr,i,tegn) - '@';
    end
    else ac:= 6; <* for kort telegram - retransmitter *>
  end;

  afvent_telegram:= ac;
end;
\f

message procedure b_answ side 1 - 880901/cl;

procedure b_answ(answ,ht,spec,more,ac);
  value               ht,     more,ac;
  integer array  answ,   spec;
  boolean                     more;
  integer             ht,          ac;
begin
  integer pos, i, sum, tegn;

  pos:= 1;
  skrivtegn(answ,pos,'B');
  skrivtegn(answ,pos,if more then 'B' else ' ');
  skrivtegn(answ,pos,ac+'@');
  skrivtegn(answ,pos,spec(1) shift (-18) extract 6+'@');
  skrivtegn(answ,pos,spec(1) shift (-12) extract 6+'@');
  skrivtegn(answ,pos,'@');
  skrivtegn(answ,pos,spec(1) shift (-8) extract 4+'@');
  skrivtegn(answ,pos,spec(1) extract 8+'@');
  for i:= 1 step 1 until spec(1) extract 8 do
    if spec(1+i)=0 then skrivtegn(answ,pos,'@')
    else
    begin
      skrivtegn(answ,pos,'D');
      anbringtal(answ,pos,spec(1+i),-4);
    end;
  for i:= 1 step 1 until 4 do
    skrivtegn(answ,pos,'@');
  skrivtegn(answ,pos,ht+'@');
  skrivtegn(answ,pos,'@');

  i:= 1; sum:= 0;
  while i < pos do
    sum:= (sum + læstegn(answ,i,tegn)) mod 256;
  skrivtegn(answ,pos,(sum shift (-4)) extract 4 + '@');
  skrivtegn(answ,pos,sum extract 4 + '@');
  repeat skrivtegn(answ,pos,0) until (pos mod 6)=1;
end;
\f

message procedure ann_opkald side 1 - 881108/cl;

integer procedure ann_opkald(vogn,omr);
  value                      vogn,omr;
  integer                    vogn,omr;
begin
  integer array field vt_op,ref,næste,forrige;
  integer res, t, i, o;

  waitch(cs_vt_adgang,vt_op,true,-1);
  res:= -1;
  wait(bs_opkaldskø_adgang);
  ref:= første_nødopkald;
  if ref <> 0 then
    t:= 2
  else
  begin
    ref:= første_opkald;
    t:= if ref<>0 then 1 else 0;
  end;

  if t=0 then
    res:= 19 <* kø tom *>
  else
  begin
    while ref<>0 and res=(-1) do
    begin
      if vogn=opkaldskø.ref(2) extract 14 and
          omr=opkaldskø.ref(5) extract 8
      then
        res:= 0
      else
      begin
        ref:= opkaldskø.ref(1) extract 12;
        if ref=0 and t=2 then
        begin
          ref:= første_opkald;
          t:= if ref=0 then 0 else 1;
        end;
      end;
    end; <*while*>
\f

message procedure ann_opkald side 2 - 881108/cl;

    if ref<>0 then
    begin
      start_operation(vt_op,401,cs_radio_ind,17);
      d.vt_op.data(1):= vogn;
      d.vt_op.data(4):= omr;
      signalch(cs_vt,vt_op,gen_optype or vt_optype);
      waitch(cs_radio_ind,vt_op,vt_optype,-1);

      o:= opkaldskø.ref(4) extract 8;
      næste:= opkaldskø.ref(1);
      forrige:= næste shift (-12);
      næste:= næste extract 12;
      if forrige<>0 then
        opkaldskø.forrige(1):= opkaldskø.forrige(1) shift (-12) shift 12
                               + næste
      else
      if t=2 then første_nødopkald:= næste
      else første_opkald:= næste;

      if næste<>0 then
        opkaldskø.næste(1):= opkaldskø.næste(1) extract 12
                             + forrige shift 12
      else
      if t=2 then sidste_nødopkald:= forrige
      else sidste_opkald:= forrige;

      opkaldskø.ref(1):= første_frie_opkald;
      første_frie_opkald:= ref;
      opkaldskø_ledige:= opkaldskø_ledige + 1;
      if t=2 then nødopkald_brugt:= nødopkald_brugt - 1;

      if -, læsbit_ia(operatør_maske,o) or o=0 then
        tofrom(opkaldsflag,alle_operatører,op_maske_lgd)
      else
      begin
        sætbit_ia(opkaldsflag,o,1);
      end;
      signalbin(bs_mobilopkald);
    end;
  end;

  signalbin(bs_opkaldskø_adgang);
  signalch(cs_vt_adgang, vt_op, true);
  ann_opkald:= res;
end;
\f

message procedure frigiv_id side 1 - 881114/cl;

integer procedure frigiv_id(id,omr);
  value                     id,omr;
  integer                   id,omr;
begin
  integer array field vt_op;

  if id shift (-22) < 3 and omr > 2 then
  begin
    waitch(cs_vt_adgang,vt_op,true,-1);
    start_operation(vt_op,401,cs_radio_ind,
      if id shift (-22) = 2 then 18 else 17);
    d.vt_op.data(1):= id;
    d.vt_op.data(4):= omr;
    signalch(cs_vt,vt_op,vt_optype or gen_optype);
    waitch(cs_radio_ind,vt_op,vt_optype,-1);
    frigiv_id:= d.vt_op.resultat;
    signalch(cs_vt_adgang,vt_op,true);
  end;
end;
\f

message procedure radio_ind side 2 - 810524/hko;
    trap(radio_ind_trap);
    laf:= 0;
    stack_claim((if cm_test then 200 else 150) +135+75);

<*+2*>if testbit32 and overvåget or testbit28 then
        skriv_radio_ind(out,0);
<*-2*>
      answ.laf(1):= long<:<'nl'>:>;
      io_opref:= op;

      repeat
        ac:= afvent_telegram(tlgr,lgd,ttyp,ptyp,pnum);
        pos:= 4;
        if ac = 0 then
        begin
\f

message procedure radio_ind side 3 - 881107/cl;
          if ttyp = 'A' then
          begin
            if ptyp<>4 or pnum<1 or pnum>max_antal_taleveje then
              ac:= 1
            else
            begin
              typ(1):= 1 shift 12 + (opkode - 1); <* eq shortint opgave *>
              val(1):= ttyp;
              typ(2):= 2 shift 12 + (data + 2);   <* eq integer  data(1) *>
              val(2):= pnum;
              typ(3):= -1;
              getch(cs_radio_ind,opref,rad_optype,typ,val);
              if opref>0 then
              begin
                if læstegn(tlgr,pos,tegn)<>'@' <*BST*> or
                   læstegn(tlgr,pos,tegn)<>'A' <*PET*> or
                   læstegn(tlgr,pos,tegn)<>d.opref.data(2)+'@' <*CTYP*> or
                   læstegn(tlgr,pos,tegn)<>'@' <*TNO*>
                then
                begin
                  ac:= 1; d.opref.resultat:= 31; <* systemfejl *>
                end
                else
                begin
                  ac:= 0;
                  d.opref.resultat:= 0;
                  sætbit_ia(hookoff_maske,pnum,1);
                end;
                signalch(d.opref.retur,opref,d.opref.optype);
              end
              else
                ac:= 2;
            end;
            pos:= 1;
            skrivtegn(answ,pos,'A');
            skrivtegn(answ,pos,' ');
            skrivtegn(answ,pos,ac+'@');
            for i:= 1 step 1 until 5 do
              skrivtegn(answ,pos,'@');
            skrivtegn(answ,pos,'0');
            i:= 1; sum:= 0;
            while i < pos do
              sum:= (sum + læstegn(answ,i,tegn)) mod 256;
            skrivtegn(answ,pos,sum shift (-4) extract 4 + '@');
            skrivtegn(answ,pos,sum extract 4 + '@');
            repeat afsluttext(answ,pos) until pos mod 6 = 1;
            write(z_fr_out,"nl",1,answ.laf,"cr",1);
<*+2*>      if (testbit36 or testbit38) and overvåget then
            disable begin
              write(zrl,<<zd dd dd.dd >,now,<:fr-answ: :>,answ.laf);
              outchar(zrl,'nl');
            end;
<*-2*>
            disable setposition(z_fr_out,0,0);
            ac:= -1;
\f

message procedure radio_ind side 4 - 881107/cl;
          end <* ttyp=A *>
          else
          if ttyp = 'B' then
          begin
            if ptyp<>4 or pnum<1 or pnum>max_antal_taleveje then
              ac:= 1
            else
            begin
              typ(1):= 1 shift 12 + (opkode-1); val(1):= 'B';
              typ(2):= 2 shift 12 + (data+2); val(2):= pnum;
              typ(3):= -1;
              getch(cs_radio_ind,opref,rad_optype,typ,val);
              if opref > 0 then
              begin
<*+2*> if testbit37 and overvåget then
       disable begin
         skriv_radio_ind(out,0);
         write(out,<:radio-ind B-op udtaget fra cs:>,<<d>,cs_radio_ind);
         skriv_op(out,opref);
       end;
<*-2*>
                læstegn(tlgr,pos,bs);
                if bs = 'V' then
                begin
                  b_pt:= læstegn(tlgr,pos,tegn) - '@';
                  b_pn:= læstegn(tlgr,pos,tegn) - '@';
                end;
                if bs<>'Z' and bs<>d.opref.data(2) or bs='V' and
                   (b_pt<>d.opref.data(10) shift (-18) extract 6 or
                   b_pn<>d.opref.data(10) shift (-12) extract 6)
                then
                begin
                  ac:= 1;
                  d.opref.resultat:= 31; <* systemfejl *>
                  signalch(d.opref.retur,opref,d.opref.optype);
                end
                else
                if bs='V' then
                begin
                  ac:= 0;
                  d.opref.resultat:= 1;
                  d.opref.data(4):= 0;
                  d.opref.data(7):=
                     1 shift (if b_pt=2 then pabx_id(b_pn) else
                                    radio_id(b_pn));
                  systime(1,0.0,d.opref.tid);
                  signalch(cs_radio_ind,opref,d.opref.optype);
                  spec:= data+18;
                  b_answ(answ,0,d.opref.spec,false,ac);
<*+2*>            if (testbit36 or testbit38) and overvåget then
                  disable begin
                    write(zrl,<<zd dd dd.dd >,now,<:fr-answ: :>,answ.laf);
                    outchar(zrl,'nl');
                  end;
<*-2*>
                  write(z_fr_out,"nl",1,answ.laf,"cr",1);
                  disable setposition(z_fr_out,0,0);
                  ac:= -1;
\f

message procedure radio_ind side 5 - 881107/cl;
                end
                else
                begin
                  integer sig_type;

                  ac:= 0;
                  antal_spec:= d.opref.data(4);
                  filref:= d.opref.data(5);
                  spec:= d.opref.data(6);
                  if antal_spec>0 then
                  begin
                    antal_spec:= antal_spec-1;
                    if filref<>0 then
                    begin
                      læsfil(filref,1,zno);
                      b_pt:= fil(zno).spec(1) shift (-12);
                      sig_type:= fil(zno).spec(1) shift (-8) extract 4;
                      b_answ(answ,d.opref.data(3),fil(zno).spec,
                        antal_spec>0,ac);
                      spec:= spec + (fil(zno).spec(1) extract 8 + 1)*2;
                    end
                    else
                    begin
                      b_pt:= d.opref.spec(1) shift (-12);
                      sig_type:= d.opref.spec(1) shift (-8) extract 4;
                      b_answ(answ,d.opref.data(3),d.opref.spec,
                        antal_spec>0,ac);
                      spec:= spec + d.opref.spec(1) extract 8*2 + 2;
                    end;
 
                    <* send answer *>
<*+2*>              if (testbit36 or testbit38) and overvåget then
                    disable begin
                      write(zrl,<<zd dd dd.dd >,now,<:fr-answ: :>,answ.laf);
                      outchar(zrl,'nl');
                    end;
<*-2*>
                    write(z_fr_out,"nl",1,answ.laf,"cr",1);
                    disable setposition(z_fr_out,0,0);
                    if ac<>0 then
                    begin
                      antal_spec:= 0;
                      ac:= -1;
                    end
                    else
                    begin
                      for i:= 1 step 1 until max_antal_områder do
                      if område_id(i,2)=b_pt then
                      begin
                        j:= (if b_pt=3 and sig_type=2 then 0 else i);
                        if sætbiti(d.opref.data(7),j,1)=0 then 
                          d.opref.resultat:= d.opref.resultat + 1;
                      end;
                    end;
                  end;
\f

message procedure radio_ind side 6 - 881107/cl;

                  <* afvent nyt telegram *>
                  d.opref.data(4):= antal_spec;
                  d.opref.data(6):= spec;
                  ac:= -1;
                  systime(1,0.0,d.opref.tid);
<*+2*>            if testbit37 and overvåget then
                  disable begin
                    skriv_radio_ind(out,0);
                    write(out,<:radio-ind B-op retur på cs:>,<<d>,cs_radio_ind);                    skriv_op(out,opref);
                    ud;
                  end;
<*-2*>
                  signalch(cs_radio_ind,opref,d.opref.optype);
                end;
              end
              else ac:= 2;
            end;
            if ac > 0 then
            begin
              for i:= 1 step 1 until 6 do val(i):= 0;
              b_answ(answ,0,val,false,ac);
<*+2*>
              if (testbit36 or testbit38) and overvåget then
              disable begin
                write(zrl,<<zd dd dd.dd >,now,<:fr-answ: :>,answ.laf);
                outchar(zrl,'nl');
              end;
<*-2*>
              write(z_fr_out,"nl",1,answ.laf,"cr",1);
              disable setposition(z_fr_out,0,0);
              ac:= -1;
            end;
\f

message procedure radio_ind side 7 - 881107/cl;
          end <* ttyp = 'B' *>
          else
          if ttyp='C' or ttyp='J' then
          begin
            if ptyp<>4 or pnum<1 or pnum>max_antal_taleveje then
              ac:= 1
            else
            begin
              typ(1):= 1 shift 12 + (opkode - 1); val(1):= 'B';
              typ(2):= 2 shift 12 + (data + 2); val(2):= pnum;
              typ(3):= -1;
              getch(cs_radio_ind,opref,rad_optype,typ,val);
              if opref > 0 then
              begin
                d.opref.resultat:= d.opref.resultat - 1;
                if ttyp  = 'C' then
                begin
                  b_pt:= læstegn(tlgr,4,tegn)-'@'; <* ????? *>
                  b_pn:= læstegn(tlgr,5,tegn)-'@'; <* ????? *>
                  j:= 0;
                  for i:= 1 step 1 until max_antal_kanaler do
                    if kanal_id(i)=b_pt shift 5 + b_pn then j:= i;
                  if kanal_til_omr(j)=3 and d.opref.resultat>0 then
                    d.opref.resultat:= d.opref.resultat-1;
                  sætbiti(optaget_flag,j,1);
                  sætbiti(d.opref.data(9),j,1);
                end
                else
                begin <* INGEN FORBINDELSE *>
                  sætbiti(d.opref.data(8),læstegn(tlgr,4,tegn)-'@',1);
                end;
                ac:= 0;
                if d.opref.resultat<>0 or d.opref.data(4)<>0 then
                begin
                  systime(1,0,d.opref.tid);
                  signal_ch(cs_radio_ind,opref,d.opref.op_type);
                end
                else
                begin
                  d.opref.resultat:= if d.opref.data(9)<>0 then 0 else 
                     if læsbiti(d.opref.data(8),9) then 52 else
                     if læsbiti(d.opref.data(8),10) then 20 else
                     if læsbiti(d.opref.data(8),2) then 52 else 59;
                  signalch(d.opref.retur, opref, d.opref.optype);
                end;
              end
              else
                ac:= 2;
            end;
            pos:= 1;
            skrivtegn(answ,pos,ttyp);
            skrivtegn(answ,pos,' ');
            skrivtegn(answ,pos,ac+'@');
            i:= 1; sum:= 0;
            while i < pos do
              sum:= (sum + læstegn(answ,i,tegn)) mod 256;
            skrivtegn(answ,pos,sum shift (-4) + '@');
            skrivtegn(answ,pos,sum extract 4 + '@');
            repeat afsluttext(answ,pos) until pos mod 6 = 1;
<*+2*>      if (testbit36 or testbit38) and overvåget then
            disable begin
              write(zrl,<<zd dd dd.dd >,now,<:fr-answ: :>,answ.laf);
              outchar(zrl,'nl');
            end;
<*-2*>
            write(z_fr_out,"nl",1,answ.laf,"cr",1);
            disable setposition(z_fr_out,0,0);
            ac:= -1;
\f

message procedure radio_ind side 8 - 881107/cl;
          end <* ttyp = 'C' or 'J' *>
          else
          if ttyp = 'D' then
          begin
            if ptyp = 4 <* VDU *> then
            begin
              if pnum<1 or pnum>max_antal_taleveje then
                ac:= 1
              else
              begin
                inspect(bs_talevej_udkoblet(pnum),j);
                if j>=0 then
                begin
                  sætbit_ia(samtaleflag,pnum,1);
                  signal_bin(bs_mobil_opkald);
                end;
                if læsbit_ia(hookoff_maske,pnum) then
                  signalbin(bs_talevej_udkoblet(pnum));
                ac:= 0;
              end
            end
            else
            if ptyp=3 or ptyp=2 then
            begin
              if ptyp=3 and (pnum<1 or max_antal_radiokanaler<pnum) or
                 ptyp=2 and pnum<>2
              then
                ac:= 1
              else
              begin
                if læstegn(tlgr,5,tegn)='D' then
                begin <* teknisk nr i telegram *>
                  b_pn:= 0;
                  for i:= 1 step 1 until 4 do
                    b_pn:= b_pn*10 + læstegn(tlgr,5+i,tegn)-'0';
                end
                else
                  b_pn:= 0;
                b_pt:= port_til_omr(ptyp shift 6 + pnum);
                i:= 0;
                for j:= 1 step 1 until max_antal_kanaler do
                if kanal_id(j) = ptyp shift 5 + pnum then i:= j;
                if i<>0 then
                begin
                  ref:= (i-1)*kanalbeskrlængde;
                  inspect(ss_samtale_nedlagt(i),j);
                  if j>=0 then
                  begin
                    sætbit_ia(samtaleflag,
                      tv_operatør(kanal_tab.ref.kanal_tilstand shift (-16)),1);
                    signalbin(bs_mobil_opkald);
                  end;
                  signal(ss_samtale_nedlagt(i));
                  if b_pn<>0 then frigiv_id(b_pn,b_pt);
                  begin
                    if kanal_tab.ref.kanal_id1<>0 and
                      (kanal_tab.ref.kanal_id1 shift (-22)<>0 or
                       kanal_tab.ref.kanal_id1 extract 14<>b_pn) then
                      frigiv_id(kanal_tab.ref.kanal_id1,b_pt);
                    if kanal_tab.ref.kanal_id2<>0 and
                      (kanal_tab.ref.kanal_id2 shift (-22)<>0 or
                       kanal_tab.ref.kanal_id2 extract 14<>b_pn) then
                      frigiv_id(kanal_tab.ref.kanal_id2,b_pt);
                  end;
                  sætbiti(optaget_flag,i,0);
                end;
                ac:= 0;
              end;
            end
            else ac:= 1;
            if ac>=0 then
            begin
              pos:= i:= 1; sum:= 0;
              skrivtegn(answ,pos,'D');
              skrivtegn(answ,pos,' ');
              skrivtegn(answ,pos,ac+'@');
              skrivtegn(answ,pos,'@');
              while i<pos do
                sum:= (sum + læstegn(answ,i,tegn)) mod 256;
              skrivtegn(answ,pos, sum shift (-4) extract 4 + '@');
              skrivtegn(answ,pos, sum extract 4 + '@');
              repeat afsluttext(answ,pos) until pos mod 6 = 1;
<*+2*>
              if (testbit36 or testbit38) and overvåget then
              disable begin
                write(zrl,<<zd dd dd.dd >,now,<:fr-answ: :>,answ.laf);
                outchar(zrl,'nl');
              end;
<*-2*>
              write(z_fr_out,"nl",1,answ.laf,"cr",1);
              disable setposition(z_fr_out,0,0);
              ac:= -1;
            end;
\f

message procedure radio_ind side 9 - 881107/cl;
          end <* ttyp = D *>
          else
          if ttyp='H' then
          begin
            integer htyp;

            htyp:= læstegn(tlgr,7+læstegn(tlgr,6,tegn)-'@',tegn);

            if htyp='A' then
            begin <*mobilopkald*>
             if (ptyp=2 and pnum<>2) or (ptyp=3 and
               (pnum<1 or pnum>max_antal_radiokanaler)) then
                 ac:= 1
             else
             begin
              b_pt:= læstegn(tlgr,5,tegn)-'@';
              if læstegn(tlgr,6,tegn)='D' then
              begin <*teknisk nr. i telegram*>
                b_pn:= 0;
                for i:= 1 step 1 until 4 do
                  b_pn:= b_pn*10 + læstegn(tlgr,6+i,tegn)-'0';
              end
              else b_pn:= 0;
              bs:= læstegn(tlgr,9+læstegn(tlgr,6,tegn)-'@',tegn)-'@'+1;
                                      <* opkaldstype *>
              j:= (if ptyp=2 then pabx_id(pnum) else radio_id(pnum));
              if j>0 then
              begin
                if bs=10 then
                  ann_opkald(b_pn,j)
                else
                  indsæt_opkald(b_pn,bs,j,if b_pt>1 then 1 else 0);
                ac:= 0;
              end else ac:= 1;
             end;
\f

message procedure radio_ind side 10 - 881107/cl;
            end
            else
            if htyp='E' then
            begin <* radiokanal status *>
              long onavn;

              ac:= 0;
              j:= 0;
              for i:= 1 step 1 until max_antal_kanaler do
              if kanal_id(i) = ptyp shift 5 + pnum then j:= i;

              <* Alarmer for K12 = GLX ignoreres *>
              <* 94.06.14/CL                     *>
              <* Alarmer for K15 = HG  ignoreres *>
              <* 95.07.31/CL                     *>
              <* Alarmer for K10 = FS  ignoreres *>
              <* 96.05.27/CL                     *>
              if j>0 then
              begin
                onavn:= områdenavn(port_til_omr(ptyp shift 6 + pnum));
                j:= (if (onavn = long<:GLX:>) or (onavn = long<:HG:>) or
                     (onavn = long<:FS:>) then 0 else j);
              end;

              læstegn(tlgr,9,tegn);
              if j<>0 and (tegn='A' or tegn='E') then
              begin
                ref:= (j-1)*kanalbeskrlængde;
                bs:= if tegn='E' then 0 else 15;
                if bs<>sæt_hex_ciffer(kanal_tab.ref,3,bs) then
                begin
                  tofrom(kanalflag,alle_operatører,op_maske_lgd);
                  signalbin(bs_mobil_opkald);
                end;
              end;
              if tegn<>'A' and tegn<>'E' and j<>0 then
              begin
                waitch(cs_radio_pulje,opref,true,-1);
                startoperation(opref,401,cs_radio_pulje,23);
                i:= 1;
                hægtstring(d.opref.data,i,<:radiofejl :>);
                if læstegn(tlgr,4,k)<>'@' then
                begin
                  if k-'@' = 17 then
                    hægtstring(d.opref.data,i,<: AMV:>)
                  else
                  if k-'@' = 18 then
                    hægtstring(d.opref.data,i,<: BHV:>)
                  else
                  begin
                    hægtstring(d.opref.data,i,<: BST:>);
                    anbringtal(d.opref.data,i,k-'@',1);
                  end;
                end;
                skrivtegn(d.opref.data,i,' ');
                hægtstring(d.opref.data,i,string kanal_navn(j));
                skrivtegn(d.opref.data,i,' ');
                hægtstring(d.opref.data,i,
                  string område_navn(kanal_til_omr(j)));
                if '@'<=tegn and tegn<='F' then
                  hægtstring(d.opref.data,i,case (tegn-'@'+1) of (
                    <*@*> <:: ukendt fejl:>,
                    <*A*> <:: compad-fejl:>,
                    <*B*> <:: ladefejl:>,
                    <*C*> <:: dør åben:>,
                    <*D*> <:: senderfejl:>,
                    <*E*> <:: compad ok:>,
                    <*F*> <:: liniefejl:>,
                    <::>))
                else
                begin
                  hægtstring(d.opref.data,i,<:: fejlkode :>);
                  skrivtegn(d.opref.data,i,tegn);
                end;
                repeat afsluttext(d.opref.data,i) until i mod 6 = 1;
                signalch(cs_io,opref,gen_optype or rad_optype);
                ref:= (j-1)*kanalbeskrlængde;
                tofrom(kanal_tab.ref.kanal_alarm,alle_operatører,op_maske_lgd);
                tofrom(kanalflag,alle_operatører,op_maske_lgd);
                signalbin(bs_mobilopkald);
              end;
\f

message procedure radio_ind side 11 - 881107/cl;
            end
            else
            if htyp='G' then
            begin <* fjerninkludering/-ekskludering af område *>
              bs:= læstegn(tlgr,9,tegn)-'@';
              j:= 0;
              for i:= 1 step 1 until max_antal_kanaler do
              if kanal_id(i) = ptyp shift 5 + pnum then j:= i;
              if j<>0 then
              begin
                ref:= (j-1)*kanalbeskrlængde;
                sætbiti(kanal_tab.ref.kanal_tilstand,11,bs extract 1);
              end;
              tofrom(kanalflag,alle_operatører,op_maske_lgd);
              signalbin(bs_mobilopkald);
              ac:= 0;
            end
            else
            if htyp='L' then
            begin <* vogntabelændringer *>
              long field ll;

              ll:= 10;
              ac:= 0;
              zno:= port_til_omr(ptyp shift 6 + pnum);
              læstegn(tlgr,9,tegn);
              if (tegn='N') or (tegn='O') then
              begin
                typ(1):= 1 shift 12 + (opkode-1); val(1):= 'H';
                typ(2):= -1;
                getch(cs_radio_ind,opref,rad_optype,typ,val);
                if opref>0 then
                begin
                  d.opref.resultat:= if tegn='N' then 3 else 60;
                  signalch(d.opref.retur,opref,d.opref.optype);
                end;
                ac:= -1;
              end
              else
              if (tegn='G') and (tlgr.ll=(long<:FFFFF:> add 'F')) then
                ac:= -1
              else
              if tegn='G' then <*indkodning*>
              begin
                pos:= 10; i:= 0;
                while læstegn(tlgr,pos,tegn)>='0' and tegn<='9' and pos<=14 do
                  i:= i*10 + (tegn-'0');
                i:= i mod 1000;
                b_pn:= (1 shift 22) + (i shift 12);
                if pos=14 and 'A'<=tegn and tegn<='Å' then
                  b_pn:= b_pn + ((tegn-'@') shift 7);
                pos:= 14; i:= 0;
                while læstegn(tlgr,pos,tegn)>='0' and tegn<='9' and pos<=16 do
                  i:= i*10 + (tegn-'0');
                b_pn:= b_pn + i;
                pos:= 16; i:= 0;
                while læstegn(tlgr,pos,tegn)>='0' and tegn<='9' and pos<=20 do
                  i:= i*10 + (tegn-'0');
                b_pt:= i;
                bs:= 11;
\f

message procedure radio_ind side 12 - 881107/cl;
              end
              else
              if tegn='H' then <*udkodning*>
              begin
                pos:= 10; i:= 0;
                while læstegn(tlgr,pos,tegn)>='0' and tegn<='9' and pos<=14 do
                  i:= i*10 + (tegn-'0');
                b_pt:= i;
                b_pn:= 0;
                bs:= 12;
              end
              else
              if tegn='I' then <*slet tabel*>
              begin
                b_pt:= 1; b_pn:= 999; bs:= 19;
                pos:= 10; i:= 0;
                i:= hex_to_dec(læstegn(tlgr,pos,tegn))*16 +
                    hex_to_dec(læstegn(tlgr,pos,tegn));
                zno:= i;
              end
              else ac:= 2;
              if ac<0 then
                ac:= 0
              else

              if ac=0 then
              begin
                waitch(cs_vt_adgang,opref,true,-1);
                startoperation(opref,401,cs_vt_adgang,bs);
                d.opref.data(1):= b_pt;
                d.opref.data(2):= b_pn;
                d.opref.data(if bs=19 then 3 else 4):= zno;
                signalch(cs_vt,opref,gen_optype or vt_optype);
              end;
            end
            else
              ac:= 2;

            pos:= 1;
            skrivtegn(answ,pos,'H');
            skrivtegn(answ,pos,' ');
            skrivtegn(answ,pos,ac+'@');
            i:= 1; sum:= 0;
            while i < pos do
              sum:= (sum + læstegn(answ,i,tegn)) mod 256;
            skriv_tegn(answ,pos, sum shift (-4) extract 4 +'@');
            skriv_tegn(answ,pos, sum extract 4 +'@');
            repeat afsluttext(answ,pos) until pos mod 6 = 1;
<*+2*>      if (testbit36 or testbit38) and overvåget then
            disable begin
              write(zrl,<<zd dd dd.dd >,now,<:fr-answ: :>,answ.laf);
              outchar(zrl,'nl');
            end;
<*-2*>
            write(z_fr_out,"nl",1,answ.laf,"cr",1);
            disable setposition(z_fr_out,0,0);
            ac:= -1;
\f

message procedure radio_ind side 13 - 881107/cl;
          end
          else
          if ttyp = 'I' then
          begin
            typ(1):= -1;
            repeat
              getch(cs_radio_ind,opref,true,typ,val);
              if opref<>0 then
              begin
                d.opref.resultat:= 31;
                signalch(d.opref.retur,opref,d.opref.op_type);
              end;
            until opref=0;
            for i:= 1 step 1 until max_antal_taleveje do
              if læsbit_ia(hookoff_maske,i) then
              begin
                signalbin(bs_talevej_udkoblet(i));
                sætbit_ia(samtaleflag,tv_operatør(i),1);
              end;
            if antal_bits_ia(samtaleflag,1,max_antal_operatører)<>0 then
              signal_bin(bs_mobil_opkald);
            for i:= 1 step 1 until max_antal_kanaler do
            begin
              ref:= (i-1)*kanalbeskrlængde;
              if kanal_tab.ref.kanal_tilstand extract 2 <> 0 then
              begin
                if kanal_tab.ref.kanal_id2<>0 and
                   kanal_tab.ref.kanal_id2 shift (-22)<>3
                then
                begin
                  signal(ss_samtale_nedlagt(i));
                  frigiv_id(kanal_tab.ref.kanal_id2,kanal_til_omr(i));
                end;
                if kanal_tab.ref.kanal_id1<>0 then
                begin
                  signal(ss_samtale_nedlagt(i));
                  frigiv_id(kanal_tab.ref.kanal_id1,kanal_til_omr(i));
                end;
              end;
              sæt_hex_ciffer(kanal_tab.ref,3,15);
            end;
<*V*>       waitch(cs_radio_pulje,opref,true,-1);
            startoperation(opref,401,cs_radio_pulje,23);
            i:= 1;
            hægtstring(d.opref.data,i,<:radio-info: :>);
            j:= 4;
            while j<=lgd and i<(d.opref.opsize - data - 2)//2*3 do
            begin
              skrivtegn(d.opref.data,i,læstegn(tlgr,j,tegn));
            end;
            repeat afsluttext(d.opref.data,i) until i mod 6 = 1;
            signalch(cs_io,opref,gen_optype or rad_optype);
            optaget_flag:= 0;
            pos:= i:= 1; sum:= 0;
            skrivtegn(answ,pos,'I');
            skrivtegn(answ,pos,' ');
            skrivtegn(answ,pos,'@');
            while i<pos do
              sum:= (sum+læstegn(answ,i,tegn)) mod 256;
            skrivtegn(answ,pos,sum shift (-4) extract 4 + '@');
            skrivtegn(answ,pos,sum extract 4 + '@');
            repeat afsluttext(answ,pos) until pos mod 6 = 1;
<*+2*>      if (testbit36 or testbit38) and overvåget then
            disable begin
              write(zrl,<<zd dd dd.dd >,now,<:fr-answ: :>,answ.laf); 
              outchar(zrl,'nl');
            end;
<*-2*>
            write(z_fr_out,"nl",1,answ.laf,"cr",1);
            disable setposition(z_fr_out,0,0);
            ac:= -1;
\f

message procedure radio_ind side 14 - 881107/cl;
          end
          else
          if ttyp='L' then
          begin
            ac:= 0;
<****** RADIO-INFO meddelelser til hovedkonsol afhængig af testbi21 ******>
           if testbit21 then
           begin
            waitch(cs_radio_pulje,opref,true,-1);
            startoperation(opref,401,cs_radio_pulje,23);
            i:= 1;
            hægtstring(d.opref.data,i,<:radio-info: :>);
            j:= 4;
            while j<=lgd and i<(d.opref.opsize-data-2)//2*3 do
            begin
              skrivtegn(d.opref.data,i,læstegn(tlgr,j,tegn));
            end;
            repeat afsluttext(d.opref.data,i) until i mod 6 = 1;
            signalch(cs_io,opref,gen_optype or rad_optype);
           end; <*testbit21*>
          end
          else
          if ttyp='Z' then
          begin
<*+2*>      if (testbit36 or testbit38) and overvåget then
            disable begin
              write(zrl,<<zd dd dd.dd >,now,<:fr-answ: :>,answ.laf); 
              outchar(zrl,'nl');
            end;
<*-2*>
            write(z_fr_out,"nl",1,answ.laf,"cr",1);
            disable setposition(z_fr_out,0,0);
            ac:= -1;
          end
          else
            ac:= 1;
        end; <* telegram modtaget ok *>
\f

message procedure radio_ind side 15 - 881107/cl;
        if ac>=0 then
        begin
          pos:= i:= 1; sum:= 0;
          skrivtegn(answ,pos,ttyp);
          skrivtegn(answ,pos,' ');
          skrivtegn(answ,pos,ac+'@');
          while i<pos do
            sum:= (sum+læstegn(answ,i,tegn)) mod 256;
          skrivtegn(answ,pos, sum shift (-4) extract 4 + '@');
          skrivtegn(answ,pos, sum extract 4 + '@');
          repeat afsluttext(answ,pos) until pos mod 6 = 1;
<*+2*>    if (testbit36 or testbit38) and overvåget then
          disable begin
            write(zrl,<<zd dd dd.dd >,now,<:fr-answ: :>,answ.laf); 
            outchar(zrl,'nl');
          end;
<*-2*>
          write(z_fr_out,"nl",1,answ.laf,"cr",1);
          disable setposition(z_fr_out,0,0);
          ac:= -1;
        end;
  
        typ(1):= 0;
        typ(2):= 1 shift 18 + 4 shift 12 + tid; <* lt real tid *>
        rf:= 4;
        systime(1,0.0,val.rf);
        val.rf:= val.rf - 30.0;
        typ(3):= -1;
        repeat
          getch(cs_radio_ind,opref,true,typ,val);
          if opref>0 then
          begin
            d.opref.resultat:= 53; <*annuleret*>
            signalch(d.opref.retur,opref,d.opref.optype);
          end;
        until opref=0;

      until false;

radio_ind_trap:
    
      disable skriv_radio_ind(zbillede,1);
  
    end radio_ind;
\f

message procedure radio_ud side 1 - 820301/hko;

  procedure radio_ud(op);
      value          op;
      integer        op;
    begin
      integer array field opref,io_opref;
      integer opgave, kode, pos, tegn, i, sum, rc, svar_status;
      integer array answ, tlgr(1:32);
      long array field laf;

      procedure skriv_radio_ud(z,omfang);
        value                    omfang;
        zone                   z;
        integer                  omfang;
        begin integer i1;
          disable i1:= write(z,"nl",1,<:+++ radio-ud  ::>);
          if omfang > 0 then
          disable begin real x; long array field tx;
            tx:= 0;
            trap(slut);
            write(z,"nl",1,
                <:  opref:        :>,opref,"nl",1,
                <:  io-opref:     :>,io_opref,"nl",1,
                <:  opgave:       :>,opgave,"nl",1,
                <:  kode:         :>,kode,"nl",1,
                <:  pos:          :>,pos,"nl",1,
                <:  tegn:         :>,tegn,"nl",1,
                <:  i:            :>,i,"nl",1,
                <:  sum:          :>,sum,"nl",1,
                <:  rc:           :>,rc,"nl",1,
                <:  svar-status:  :>,svar_status,"nl",1,
                <:  tlgr:         ":>,tlgr.tx,<:":>,"nl",1,
                <:  answ:         ":>,answ.tx,<:":>,"nl",1,
                <::>);
           skriv_coru(z,coru_no(402));
slut:
         end; <*disable*>
       end skriv_radio_ud;

      trap(radio_ud_trap);
      laf:= 0;
      stack_claim((if cm_test then 200 else 150) +35+100);

<*+2*>if testbit32 and overvåget  or testbit28 then
        skriv_radio_ud(out,0);
<*-2*>

      io_opref:= op;
\f

message procedure radio_ud side 2 - 810529/hko;

      repeat

<*V*>   wait_ch(cs_radio_ud,op_ref,gen_optype or rad_optype,-1);
        kode:= d.op_ref.opkode;
        opgave:= kode shift(-12);
        kode:= kode extract 12;
        if opgave < 'A' or opgave > 'I' then
        begin
          d.opref.resultat:= 31;
        end
        else
        begin
          pos:= 1;
          if opgave='A' or opgave='B' or opgave='D' or opgave='H' then
          begin
            skrivtegn(tlgr,pos,opgave);
            if d.opref.data(1) = 0 then
            begin
              skrivtegn(tlgr,pos,'G');
              skrivtegn(tlgr,pos,'A');
            end
            else
            begin
              skrivtegn(tlgr,pos,'D');
              skrivtegn(tlgr,pos,d.opref.data(1)+'@'); <*talevejsnr*>
            end;
            if opgave='A' then
            begin
              skrivtegn(tlgr,pos,d.opref.data(2)+'@'); <*calltype*>
            end
            else
            if opgave='B' then
            begin
              skrivtegn(tlgr,pos,d.opref.data(2));
              if d.opref.data(2)='V' then
              begin
                skrivtegn(tlgr,pos,
                    d.opref.data(10) shift (-18) extract 6+'@'); <*trunktype*>
                skrivtegn(tlgr,pos,
                    d.opref.data(10) shift (-12) extract 6+'@'); <*trunknum.*>
              end;
              d.opref.data(7):= d.opref.data(8):= d.opref.data(9):= 0;
              d.opref.data(6):= if d.opref.data(5)<>0 then 2 else data+18;
            end
            else
            if opgave='H' then
            begin
              skrivtegn(tlgr,pos,d.opref.data(3)+'@'); <*trunktype*>
              skrivtegn(tlgr,pos,d.opref.data(4)+'@'); <*trunknum.*>
              hægtstring(tlgr,pos,<:@@@:>);
              skrivtegn(tlgr,pos,d.opref.data(2)); <*H_tlgr_type*>
              skrivtegn(tlgr,pos,'A');
              skrivtegn(tlgr,pos,(if d.opref.data(2)='L' and
                 d.opref.data(5)=8 then 7 else d.opref.data(5))+'@'); 
              if d.opref.data(2)='L' then
              begin
                if d.opref.data(5)=7 then
                begin
                  anbringtal(tlgr,pos,
                    d.opref.data(8) shift (-12) extract 10,-4);
                  anbringtal(tlgr,pos,
                    d.opref.data(8) extract 7,-2);
                end
                else
                if d.opref.data(5)=8 then
                begin
                  hægtstring(tlgr,pos,<:FFFFFF:>);
                end;
                if d.opref.data(5)<>9 then
                  anbringtal(tlgr,pos,d.opref.data(7),-4);
                skrivtegn(tlgr,pos,
                  dec_to_hex(d.opref.data(6) shift (-4) extract 4));
                skrivtegn(tlgr,pos,
                  dec_to_hex(d.opref.data(6) extract 4));
                skrivtegn(tlgr,10,pos-11+'@');
              end;
            end;
          end
          else
          if opgave='I' then
          begin
            hægtstring(tlgr,pos,<:IGA:>);
          end
          else d.opref.resultat:= 31; <*systemfejl*>
        end;
\f

message procedure radio_ud side 3 - 881107/cl;

        if d.opref.resultat=0 then
        begin
          if (opgave <= 'B')
             <* or (opgave='H' and d.opref.data(2)='L') *> then
          begin
            systime(1,0,d.opref.tid);
            signalch(cs_radio_ind,opref,d.opref.optype);
            opref:= 0;
          end;
          <* beregn checksum og send *>
          i:= 1; sum:= 0;
          while i < pos do
            sum:= (sum + læstegn(tlgr,i,tegn)) mod 256;
          skrivtegn(tlgr,pos,sum shift (-4) + '@');
          skrivtegn(tlgr,pos,sum extract 4  + '@');
          repeat skrivtegn(tlgr,pos,0) until pos mod 6 = 1;
<**********************************************>
<* specialaktion p.g.a. modtagebesvær i COMET *>

          if opgave='B' then delay(1);
 
<*                                94.04.19/cl *>
<**********************************************>
 
<*+2*>    if (testbit36 or testbit39) and overvåget then
          disable begin
            write(zrl,<<zd dd dd.dd >,now,<:rf-tlgr: :>,tlgr.laf);
            outchar(zrl,'nl');
          end;
<*-2*>
          setposition(z_rf_in,0,0);
          write(z_rf_out,"nl",1,tlgr.laf,"cr",1);
          disable setposition(z_rf_out,0,0);
          rc:= 0;

          <* afvent svar*>
          repeat
<*V*>       svar_status:= afvent_radioinput(z_rf_in,answ,true);
            if svar_status=6 then
            begin
              svar_status:= -3;
              goto radio_ud_check;
            end;
            pos:= 1;
            while læstegn(answ,pos,i)<>0 do ;
            pos:= pos-2;
            if pos > 0 then
            begin
              if pos<3 then
                svar_status:= -2 <*format error*>
              else
              begin
                if læstegn(answ,3,tegn)<>'@' then
                  svar_status:= tegn - '@'
                else
                begin
                  pos:= 1;
                  læstegn(answ,pos,tegn);
                  if tegn<>opgave then
                    svar_status:= -4 <*gal type*>
                  else
                  if læstegn(answ,pos,tegn)<>' ' then
                    svar_status:= -tegn <*fejl*>
                  else
                    svar_status:= læstegn(answ,pos,tegn)-'@';
                end;
              end;
            end
            else
              svar_status:= -1;
\f

message procedure radio_ud side 5 - 881107/cl;

radio_ud_check:
            rc:= rc+1;
            if -3<=svar_status and svar_status< -1 then
            disable begin
              write(z_rf_out,<:<'nl'>Z@@MJ<'cr'>:>);
              setposition(z_rf_out,0,0);
<*+2*>        if (testbit36 or testbit39) and overvåget then
              begin
                write(zrl,<<zd dd dd.dd >,now,<:rf-tlgr: Z@@MJ:>);
                outchar(zrl,'nl');
              end;
<*-2*>
            end
            else
            if svar_status=6 or svar_status=(-4) or svar_status=(-1) then
            disable begin
              write(z_rf_out,"nl",1,tlgr.laf,"cr",1);
              setposition(z_rf_out,0,0);
<*+2*>        if (testbit36 or testbit39) and overvåget then
              begin
                write(zrl,<<zd dd dd.dd >,now,<:rf-tlgr: :>,
                  tlgr.laf,<: (repeat):>); outchar(zrl,'nl');
              end;
<*-2*>
            end
            else
            if svar_status=0 and opref<>0 then
              d.opref.resultat:= 0
            else
            if opref<>0 then
              d.opref.resultat:= 31;
          until svar_status=0 or rc>3;
        end;
        if opref<>0 then
        begin
          if svar_status<>0 and rc>3 then
            d.opref.resultat:= 53; <* annulleret *>
          signalch(d.opref.retur,opref,d.opref.optype);
          opref:= 0;
        end;
      until false;

radio_ud_trap:

      disable skriv_radio_ud(zbillede,1);

    end radio_ud;
\f

message procedure radio_medd_opkald side 1 - 810610/hko;

  procedure radio_medd_opkald;
    begin
      integer array field ref,op_ref;
      integer i;

      procedure skriv_radio_medd_opkald(z,omfang);
        value                             omfang;
        zone                            z;
        integer                           omfang;
        begin integer x;
          disable x:= write(z,"nl",1,<:+++ radio-medd-opkald:>);
          write(z,"sp",26-x);
          if omfang > 0 then
          disable begin
            trap(slut);
            write(z,"nl",1,
              <:  ref:    :>,ref,"nl",1,
              <:  opref:  :>,op_ref,"nl",1,
              <:  i:      :>,i,"nl",1,
              <::>);
            skriv_coru(z,abs curr_coruno);
slut:
          end;<*disable*>
        end skriv_radio_medd_opkald;

      trap(radio_medd_opkald_trap);

      stack_claim((if cm_test then 200 else 150) +1);

<*+2*>if testbit32 and overvåget or testbit28 then
        disable skriv_radio_medd_opkald(out,0);
<*-2*>
\f

message procedure radio_medd_opkald side 2 - 820301/hko;

      repeat

<*V*>   wait(bs_mobil_opkald);
<*V*>   wait_ch(cs_radio_medd,op_ref,genoptype or rad_optype,-1);
<*V*>   wait(bs_opkaldskø_adgang);

        ref:= første_nød_opkald;
        while ref <> 0 do <* meld ikke meldt nødopkald til io *>
        begin
          i:= opkaldskø.ref(2);
          if i < 0 then
          begin
            <* nødopkald ikke meldt *>

            start_operation(op_ref,403,cs_radio_medd,45<*nødop.modt.*>);
            d.op_ref.data(1):= <* vogn_id *>
              if opkaldskø.ref(3)<>0 then opkaldskø.ref(3) else i extract 22;
            opkaldskø.ref(2):= i extract 22;
            d.op_ref.data(2):= opkaldskø.ref(4) shift(-12); <* ttmm *>
            d.op_ref.data(3):= opkaldskø.ref(5) extract 20;
            i:= op_ref;
<*+2*>      if testbit35 and overvåget then
            disable begin
              write(out,"nl",1,<:radio nød-medd:>);
              skriv_op(out,op_ref);
              ud;
            end;
<*-2*>
            signal_ch(cs_io,op_ref,gen_optype or rad_optype);
<*V*>       wait_ch(cs_radio_medd,op_ref,rad_optype,-1);
<*+4*>      if i <> op_ref then
              fejlreaktion(11<*fremmed post*>,i,<:radio io/medd:>,0);
<*-4*>
          end;<*nødopkald ikke meldt*>

          ref:= opkaldskø.ref(1) extract 12;
        end; <* melding til io *>
\f

message procedure radio_medd_opkald side 3 - 820304/hko;

        start_operation(op_ref,403,cs_radio_medd,
                        40<*opdater opkaldskøbill*>);
        signal_bin(bs_opkaldskø_adgang);
<*+2*>  if testbit35 and overvåget then
        disable begin
          write(out,"nl",1,<:radio opdater opkaldskø-billede:>);
          skriv_op(out,op_ref);
          write(out,       <:opkaldsflag: :>,"nl",1);
          outintbits_ia(out,opkaldsflag,1,op_maske_lgd//2);
          write(out,"nl",1,<:kanalflag:   :>,"nl",1);
          outintbits_ia(out,kanalflag,1,op_maske_lgd//2);
          write(out,"nl",1,<:samtaleflag: :>,"nl",1);
          outintbits_ia(out,samtaleflag,1,op_maske_lgd//2);
          ud;
        end;
<*-2*>
        signal_ch(cs_op,op_ref,gen_optype or rad_optype);

      until false;

radio_medd_opkald_trap:

      disable skriv_radio_medd_opkald(zbillede,1);

    end radio_medd_opkald;
\f

message procedure radio_adm side 1 - 820301/hko;

  procedure radio_adm(op);
  value               op;
  integer             op;
    begin
      integer array field opref, rad_op, iaf;
      integer nr,i,j,k,res,opgave,tilst,operatør;

      procedure skriv_radio_adm(z,omfang);
        value                 omfang;
        zone                z;
        integer               omfang;
        begin integer i1;
          disable i1:= write(z,"nl",1,<:+++ radio-adm:>);
          write(z,"sp",26-i1);
          if omfang > 0 then
          disable begin real x;
            trap(slut);
\f

message procedure radio_adm side 2- 820301/hko;

            write(z,"nl",1,
              <:  op_ref:    :>,op_ref,"nl",1,
              <:  iaf:       :>,iaf,"nl",1,
              <:  rad-op:    :>,rad_op,"nl",1,
              <:  nr:        :>,nr,"nl",1,
              <:  i:         :>,i,"nl",1,
              <:  j:         :>,j,"nl",1,
              <:  k:         :>,k,"nl",1,
              <:  tilst:     :>,tilst,"nl",1,
              <:  res:       :>,res,"nl",1,
              <:  opgave:    :>,opgave,"nl",1,
              <:  operatør:  :>,operatør,"nl",1);
            skriv_coru(z,coru_no(404));
slut:
          end;<*disable*>
        end skriv_radio_adm;
\f

message procedure radio_adm side 3 - 820304/hko;

      rad_op:= op;

      trap(radio_adm_trap);
      stack_claim((if cm_test then 200 else 150) +50);

<*+2*>if testbit32 and overvåget or testbit28 then
        skriv_radio_adm(out,0);
<*-2*>

      pass;
      if -,testbit22 then
      begin
        startoperation(rad_op,404,cs_radio_adm,'I' shift 12 + 60);
        signalch(cs_radio_ud,rad_op,rad_optype);
        waitch(cs_radio_adm,rad_op,rad_optype,-1);
      end;
      repeat
        waitch(cs_radio_adm,opref,true,-1);
<*+2*>
        if testbit33 and overvåget then
        disable begin
          skriv_radio_adm(out,0);
          write(out,<: operation modtaget på cs:>,<<d>,cs_radio_adm);
          skriv_op(out,opref);
        end;
<*-2*>

        k:= d.op_ref.opkode extract 12;
        opgave:= d.opref.opkode shift (-12);
        nr:=operatør:=d.op_ref.data(1);

<*+4*>  if (d.op_ref.optype and
              (gen_optype or io_optype or op_optype or vt_optype))
          extract 12 = 0 then fejlreaktion(12<*operationstype*>,op_ref,
                                <:radio_adm:>,0);
<*-4*>
        if k = 74 <* RA,I *> then
        begin
          startoperation(rad_op,404,cs_radio_adm,'I' shift 12 + 60);
          signalch(cs_radio_ud,rad_op,rad_optype);
          waitch(cs_radio_adm,rad_op,rad_optype,-1);
          d.opref.resultat:= if d.rad_op.resultat=0 then 3
                             else d.rad_op.resultat;
          signalch(d.opref.retur,opref,d.opref.optype);
\f

message procedure radio_adm side 4 - 820301/hko;
        end
        else

        if k = 1<*IN,O*> or k = 2<*EK,O*> or k = 77<*FO,O*> or
           k = 5<*FO,L*> or k = 6<*ST  *>                   then
        begin
          if k = 5 or k=77 then
          begin

<*V*>       wait(bs_opkaldskø_adgang);
            if k=5 then
            begin
              disable for iaf:= 0 step 512 until (max_linienr//768*512) do
              begin
                i:= læs_fil(1035,iaf//512+1,nr);
                if i <> 0 then
                  fejlreaktion(5<*læs_fil*>,i,<:liniefordelingstabel:>,0);
                tofrom(radio_linietabel.iaf,fil(nr),
                  if (((max_linienr+1 - (iaf//2*3))+2)//3*2) > 512 then 512
                  else ((max_linienr+1 - (iaf//2*3))+2)//3*2);
              end;

              for i:= 1 step 1 until max_antal_mobilopkald do
              begin
                iaf:= i*opkaldskø_postlængde;
                nr:= opkaldskø.iaf(3) shift (-12) extract 10; <*linienr*>
                if nr>0 then
                begin
                  læs_tegn(radio_linietabel,nr+1,operatør);
                  if operatør>max_antal_operatører then operatør:= 0;
                  opkaldskø.iaf(4):= opkaldskø.iaf(4) shift(-8) shift 8 +
                                     operatør;
                end;
              end;
            end
            else
            if k=77 then
            begin
              disable i:= læsfil(1034,1,nr);
              if i<>0 then fejlreaktion(5,i,<:områdefordelingstabel:>,0);
              tofrom(radio_områdetabel,fil(nr),max_antal_områder*2);
              for i:= 1 step 1 until max_antal_mobilopkald do
              begin
                iaf:= i*opkaldskø_postlængde;
                nr:= opkaldskø.iaf(5) extract 4;
                operatør:= radio_områdetabel(nr);
                if operatør < 0 or max_antal_operatører < operatør then
                  operatør:= 0;
                if opkaldskø.iaf(4) extract 8=0 and
                   opkaldskø.iaf(3) shift (-12) extract 10 = 0 then
                      opkaldskø.iaf(4):= opkaldskø.iaf(4) shift(-8) shift 8 +
                                         operatør;
              end;
            end;

            tofrom(opkaldsflag,alle_operatører,op_maske_lgd);
            signal_bin(bs_opkaldskø_adgang);

            signal_bin(bs_mobil_opkald);

            d.op_ref.resultat:= res:= 3;
\f

message procedure radio_adm side 5 - 820304/hko;

          end <*k = 5 / k = 77*>
          else
          begin <*k =1,2 eller 6 (IN,O - EK,O eller ST) *>
            res:= 3;
            for nr:= 1 step 1 until max_antal_kanaler do
            begin
              iaf:= (nr-1)*kanal_beskr_længde;
              if kanal_tab.iaf.kanal_tilstand shift (-16) = 
                                              op_talevej(operatør) then
              begin
                tilst:= kanal_tab.iaf.kanal_tilstand extract 2;
                if tilst <> 0 then
                  res:= 16; <*skærm optaget*>
              end; <* kanal_tab(operatør) = operatør*>
            end;
            tofrom(opkaldsflag,alle_operatører,op_maske_lgd);
            sæt_bit_ia(opkaldsflag,operatør,k extract 1);
            signal_bin(bs_mobil_opkald);
            d.op_ref.resultat:= res;
          end;<*k=1,2 eller 6 *>

<*+2*>    if testbit35 and overvåget then
          disable begin
            skriv_radio_adm(out,0);
            write(out,<: sender til :>,
              if k=5 or k=6 or k=77 or res > 3 then d.op_ref.retur
                else cs_op);
            skriv_op(out,op_ref);
          end;
<*-2*>

          if k=5 or k=6 or k=77 or res > 3 then
            signal_ch(d.op_ref.retur,op_ref,d.op_ref.optype)
          else
          begin <*k = (1 eller 2) og res = 3 *>
            d.op_ref.resultat:=0;
            signal_ch(cs_op,op_ref,d.op_ref.optype);
          end;
\f

message procedure radio_adm side 6 - 816610/hko;

        end <*k=1,2,5 eller 6*>
        else
        if k=3 <*IN,R*> or k=4 <*EK,R*> then
        begin
          nr:= d.op_ref.data(1);
          res:= 3;

          if nr<=3 then
            res:= 51 <* afvist *>
          else
          begin

            <* gennemstilling af område *>
            j:= 1;
            for i:= 1 step 1 until max_antal_kanaler do
            begin
              if kanal_id(i) shift (-5) extract 3 = 3 and
                 radio_id(kanal_id(i) extract 5) = nr then j:= i;
            end;
            nr:= j;
            iaf:= (nr-1)*kanalbeskrlængde;
            if læsbiti(kanal_tab.iaf.kanal_tilstand,11) == (k=4) then
            begin
              startoperation(radop,404,cs_radio_adm,'H' shift 12 + 60);
              d.rad_op.data(1):= 0;
              d.rad_op.data(2):= 'G'; <* gennemstil område *>
              d.rad_op.data(3):= kanal_id(nr) shift (-5) extract 3;
              d.rad_op.data(4):= kanal_id(nr) extract 5;
              d.rad_op.data(5):= k extract 1; <* set/slet gennemstilling *>
              signalch(cs_radio_ud,rad_op,rad_optype);
              waitch(cs_radio_adm,rad_op,rad_optype,-1);
              res:= d.rad_op.resultat;
              if res=0 then res:= 3;
              sætbiti(kanal_tab.iaf.kanal_tilstand,11,k extract 1);
              sætbiti(kanal_tab.iaf.kanal_tilstand,10,k extract 1);
            end;
          end;
          d.op_ref.resultat:=res;
          signal_ch(d.op_ref.retur,op_ref,d.op_ref.optype);
          tofrom(kanalflag,alle_operatører,op_maske_lgd);
          signal_bin(bs_mobil_opkald);
\f

message procedure radio_adm side 7 - 880930/cl;


        end <* k=3 eller 4 *>
        else
        if k=72<*EK,K*> or k=73<*IN,K*> then
        begin
          nr:= d.opref.data(1) extract 22;
          res:= 3;
          iaf:= (nr-1)*kanalbeskrlængde;
            start_operation(radop,404,cs_radio_adm,'H' shift 12 + 60);
            d.rad_op.data(1):= 0;
            d.rad_op.data(2):= 'C'; <* kanal inkluder/ekskluder *>
            d.rad_op.data(3):= kanalid(nr) shift (-5) extract 3;
            d.rad_op.data(4):= kanalid(nr) extract 5;
            d.rad_op.data(5):= k extract 1;
            signalch(cs_radio_ud,radop,rad_optype);
            waitch(cs_radio_adm,radop,rad_optype,-1);
            res:= d.radop.resultat;
            if res=0 then res:= 3;
            j:= if k=72 then 15 else 0;
            if res=3 and j<>sæt_hex_ciffer(kanal_tab.iaf,3,j) then
            begin
              tofrom(kanalflag,alle_operatører,op_maske_lgd);
              signalbin(bs_mobilopkald);
            end;
          d.opref.resultat:= res;
          signalch(d.opref.retur,opref,d.opref.optype);
        end
        else
        if k=11 or k=12 or k=19 then <*vt_opd*>
        begin
          nr:= d.opref.data(1) extract 8;
          opgave:= if k=19 then 9 else (k-4);
          if nr<=3 then
           res:= 51 <*afvist*>
          else
          begin
            startoperation(radop,404,cs_radio_adm,'H' shift 12 + 60);
            d.radop.data(1):= 0;
            d.radop.data(2):= 'L';
            d.radop.data(3):= omr_til_trunk(nr) shift (-6);
            d.radop.data(4):= omr_til_trunk(nr) extract 6;
            d.radop.data(5):= opgave;
            d.radop.data(6):= d.opref.data(1) shift (-8) extract 8;
            d.radop.data(7):= d.opref.data(2);
            d.radop.data(8):= d.opref.data(3);
            signalch(cs_radio_ud,radop,rad_optype);
<*V*>       waitch(cs_radio_adm,radop,rad_optype,-1);
            res:= d.radop.resultat;
            if res=0 then res:= 3;
          end;
          d.opref.resultat:= res;
          signalch(d.opref.retur,opref,d.opref.optype);
        end
        else

        begin

          d.op_ref.resultat:= 45; <* ikke implementeret *>

          signal_ch(d.op_ref.retur,op_ref,d.op_ref.optype);

        end;
          
      until false;
radio_adm_trap:
      disable skriv_radio_adm(zbillede,1);
    end radio_adm;

:5: radio: initialisering
\f

message radio_initialisering side 1 - 820301/hko;

  cs_rad:= next_semch;
<*+3*>skriv_new_sem(out,3,cs_rad,<:cs_rad(h_mod):>);
<*-3*>

  i:= next_coru(400,<*ident*>
                 10,<*prioritet*>
                true<*test_maske*>);
  j:= new_activity(      i,
                         0,
                   h_radio);
<*+3*>skriv_newactivity(out,i,j);
<*-3*>

  opkalds_kø_ledige:= max_antal_mobilopkald;
  nødopkald_brugt:= 0;
  læsfil(1034,1,i);
  tofrom(radio_områdetabel,fil(i),max_antal_områder*2);

  opkald_meldt:= opkaldskø_postlængde - op_maske_lgd;
  for i:= system(3,j,opkaldskø) step 1 until j do
    opkaldskø(i):= 0;
  første_frie_opkald:=opkaldskø_postlængde;
  første_opkald:=sidste_opkald:=
  første_nødopkald:=sidste_nødopkald:=j:=0;

  for i:=1 step 1 until max_antal_mobil_opkald -1 do
  begin
    ref:=i*opkaldskø_postlængde;
    opkaldskø.ref(1):=j:=j shift 12 +ref +opkaldskø_postlængde;
  end;
  ref:=ref+opkaldskø_postlængde;
  opkaldskø.ref(1):=j shift 12;

  for ref:= 0 step 512 until (max_linienr//768*512) do
  begin
    i:= læs_fil(1035,ref//512+1,j);
    if i <> 0 then
      fejlreaktion(5<*læs_fil*>,i,<:liniefordelingstabel:>,0);
    tofrom(radio_linietabel.ref,fil(j),
    if (((max_linienr+1 - (ref//2*3))+2)//3*2) > 512 then 512
    else ((max_linienr+1 - (ref//2*3))+2)//3*2);
  end;

  for i:= system(3,j,kanal_tab) step 1 until j do
    kanal_tab(i):= 0;
  kanal_tilstand:= 2;
  kanal_id1:= 4;
  kanal_id2:= 6;
  kanal_spec:= 8;
  kanal_alt_id1:= 10;
  kanal_alt_id2:= 12;
  kanal_mon_maske:= 12;
  kanal_alarm:= kanal_mon_maske+tv_maske_lgd;

  for i:= 1 step 1 until max_antal_kanaler do
  begin
    ref:= (i-1)*kanalbeskrlængde;
    sæthexciffer(kanal_tab.ref,3,15);
    if kanal_id(i) shift (-5) extract 3 = 2 or
       kanal_id(i) shift (-5) extract 3 = 3 and
       radio_id(kanal_id(i) extract 5)<=3
    then
    begin
      sætbiti(kanal_tab.ref.kanal_tilstand,11,1);
      sætbiti(kanal_tab.ref.kanal_tilstand,10,1);
    end;
  end;
  tofrom(opkaldsflag,alle_operatører,op_maske_lgd);
  tofrom(samtaleflag,ingen_operatører,op_maske_lgd);
  tofrom(hookoff_maske,ingen_taleveje,tv_maske_lgd);
  optaget_flag:= 0;
\f

message radio_initialisering side 2 - 810524/hko;

  bs_mobil_opkald:= next_sem;

<*+3*>skriv_new_sem(out,1,bs_mobil_opkald,<:bs_mobil_opkald:>);
<*-3*>

  bs_opkaldskø_adgang:= next_sem;
  signal_bin(bs_opkaldskø_adgang);

<*+3*>skriv_new_sem(out,1,bs_opkaldskø_adgang,<:bs_opk.kø_adgang:>);
<*-3*>

  cs_radio_medd:=next_semch;
  signal_ch(cs_radio_medd,nextop(data+6),gen_optype or rad_optype);

<*+3*>skriv_new_sem(out,3,cs_radio_medd,<:cs_radio_medd:>);
<*-3*>

  i:= next_coru(403,
                  5,<*prioritet*>
                true<*testmaske*>);

  j:= new_activity(      i,
                         0,
         radio_medd_opkald);

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

cs_radio_adm:= nextsemch;
<*+3*>skriv_new_sem(out,3,cs_radio_adm,<:cs_radio_adm:>);
<*-3*>

i:= next_coru(404,
               10,
             true);
j:= new_activity(i,
                 0,
                 radio_adm,next_op(data+radio_op_længde));
<*+3*>skriv_new_activity(out,i,j);
<*-3*>
\f

message radio_initialisering side 3 - 810526/hko;
 for k:= 1 step 1 until max_antal_taleveje do
 begin

  cs_radio(k):=next_semch;

<*+3*>skriv_new_sem(out,3,cs_radio(k),<:cs_radio(  ):>);
<*-3*>

  bs_talevej_udkoblet(k):= nextsem;
<*+3*>skriv_new_sem(out,1,bs_talevej_udkoblet(k),<:bs_talevej_udkoblet( ):>);
<*-3*>

  i:=next_coru(410+k,
                10,
               true);

  j:=new_activity(     i,
                       0,
                  radio,k,next_op(data + radio_op_længde));

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

  cs_radio_pulje:=next_semch;

<*+3*>skriv_new_sem(out,3,cs_radio_pulje,<:cs-radio-pulje:>);
<*-3*>

  for i:= 1 step 1 until radiopulje_størrelse do
    signal_ch(cs_radio_pulje,
              next_op(60),
              gen_optype or rad_optype);

  cs_radio_kø:= next_semch;

<*+3*>skriv_new_sem(out,3,cs_radio_kø,<:cs_radio_kø:>);
<*-3*>

  mobil_opkald_aktiveret:= true;
\f

message radio_initialisering side 4 - 810522/hko;

    laf:=raf:=0;

    open(z_fr_in,8,radio_fr_navn,radio_giveup);
    i:= monitor(8)reserve process:(z_fr_in,0,ia);
    j:=1;
    if i <> 0 then
      fejlreaktion(4<*monitor resultat*>,i,
        string radio_fr_navn.raf(increase(j)),1);
    open(z_fr_out,4 shift 12 + 8,radio_fr_navn,radio_giveup);
    i:= monitor(8)reserve process:(z_fr_out,0,ia);
    j:=1;
    if i <> 0 then
      fejlreaktion(4,i,string radio_fr_navn.raf(increase(j)),1);
    ia(1):= 3 <*canonical*>;
    ia(2):= 0 <*no echo*>;
    ia(3):= 0 <*prompt*>;
    ia(4):= 5 <*timeout*>;
    setcspterm(radio_fr_navn.laf,ia);

    open(z_rf_in,8,radio_rf_navn,radio_giveup);
    i:= monitor(8)reserve process:(z_rf_in,0,ia);
    j:= 1;
    if i <> 0 then
      fejlreaktion(4<*monitor resultat*>,i,
        string radio_rf_navn.raf(increase(j)),1);
    open(z_rf_out,4 shift 12 + 8,radio_rf_navn,radio_giveup);
    i:= monitor(8)reserve process:(z_rf_out,0,ia);
    j:= 1;
    if i <> 0 then
      fejlreaktion(4,i,string radio_rf_navn.raf(increase(j)),1);
    ia(1):= 3 <*canonical*>;
    ia(2):= 0 <*no echo*>;
    ia(3):= 0 <*prompt*>;
    ia(4):= 5 <*timeout*>;
    setcspterm(radio_rf_navn.laf,ia);
\f

message radio_initialisering side 5 - 810521/hko;
    for k:= 1 step 1 until max_antal_kanaler do
    begin

      ss_radio_aktiver(k):=next_sem;
<*+3*>skriv_new_sem(out,2,ss_radio_aktiver(k),<:ss_rad_aktiver( ):>);
<*-3*>

      ss_samtale_nedlagt(k):=next_sem;
<*+3*>skriv_new_sem(out,2,ss_samtale_nedlagt(k),<:ss_samtale_nedlagt(  ):>);
<*-3*>
    end;

    cs_radio_ind:= next_semch;
<*+3*>skriv_new_sem(out,3,cs_radio_ind,<:cs_radio_ind:>);
<*-3*>

    i:= next_coru(401,<*ident radio_ind*>
                     3, <*prioritet*>
                   true <*testmaske*>);
    j:= new_activity(      i,
                           0,
                     radio_ind,next_op(data + 64));

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

    cs_radio_ud:=next_semch;
<*+3*>skriv_new_sem(out,3,cs_radio_ud,<:cs_radio_ud:>);
<*-3*>

    i:= next_coru(402,<*ident radio_out*>
                     10,<*prioritet*>
                   true <*testmaske*>);
    j:= new_activity(         i,
                              0,
                     radio_ud,next_op(data + 64));

<*+3*>skriv_newactivity(out,i,j);
<*-3*>
:6: radio trapaktion1.
\f

message radio trapaktion side 1 - 820301/hko;
  write(zbillede,"nl",2,"=",20,<: radiomodul :>,"=",20,"nl",1);
  skriv_kanal_tab(zbillede);
  skriv_opkaldskø(zbillede);
  skriv_radio_linietabel(zbillede);
  skriv_radio_områdetabel(zbillede);

:7: radio trapaktion2.
\f

message radio_finale side 1 - 810525/hko;
    write(out,<:lukker radio:>); ud;
    close(z_fr_in,true);
    close(z_fr_out,true);
    close(z_rf_in,true);
    close(z_rf_out,true);
▶EOF◀