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

⟦bfad04aa0⟧ TextFile

    Length: 122112 (0x1dd00)
    Types: TextFile
    Names: »htradio     «

Derivation

└─⟦cde9d517b⟧ Bits:30007477 RC8000 Backup tape fra HT's bus-radio system
    └─⟦6a563b143⟧ 
        └─⟦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:= 12;
    kanal_beskr_længde:= 16;
    radio_op_længde:= 30*2;
    radio_pulje_størrelse:=1 +max_antal_operatører;

: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_operatører      <* radio *>
               +2                         <* radio_input( fr/rf ) *>
               +2;                        <* radio ind/-ud*>

  max_semch:= max_semch
               +1                         <* cs_rad *>
               +max_antal_operatører      <* cs_radio *>
               +1                         <* cs_radio_pulje *>
               +1                         <* cs_radio_kø *>
               +1                         <* cs_radio_medd *>
               +1                         <* cs_radio_adm *>
               +2                         <* cs_radio_input(fr/rf) *>
               +1                         <* cs_rad_ind_input *>
               +1                         <* cs_rad_ud_input *>
               +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_operatører <* bs_operatør_udkoblet *>
    +max_sem;

  max_op:=
     + radio_pulje_størrelse   <* radio_pulje_operationer *>
     + 1                       <* radio_medd *>
     + 1                       <* radio_adm *>
     + max_antal_operatører    <* operationer for radio *>
     + 2                       <* radio_input *>
     + max_op;

  max_netto_op:=
     + radio_pulje_størrelse * 60      <* radio_pulje_operationer *>
     + data + 6                        <* radio_medd *>
     + max_antal_operatører            <* operationer for radio *>
       * (data + radio_op_længde)
     + data + radio_op_længde          <* operation for radio_adm *>
     + 2 * (data + 64)                 <* operationer for radio_input *>
     + 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_operatør_udkoblet,
    cs_radio(1:max_antal_operatører),
    cs_radio_input(1:2),
    radio_garagetabel(0:max_antal_garager),
    radio_linietabel(1:max_linienr//6+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);

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

  integer
    cs_rad,
    cs_radio_medd,
    cs_radio_adm,
    cs_radio_ind,
    cs_radio_ud,
    cs_rad_ind_input,
    cs_rad_ud_input,
    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,
    samtalekø,
    hookoff_maske,
    kanalflag,
    optaget_flag,
    opkalds_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(kanaltab.iaf,4,15)<>15 then pos:= pos+1;
          if pos>0 then
          begin
            kanal_flag:= -1 extract max_antal_operatører shift 1;
            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;
    end rad_in_fejl;
\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 *******

                       m m n
                       o o ø
nr operatør tilst  -   n b d -  type      id1      id2      ttmm/ant -ej.op:>,
        "nl",1);
      for i:=1 step 1 until max_antal_kanaler do
      begin
        ref:=(i-1)*kanal_beskr_længde;
        t:=kanal_tab.ref(1);
        id1:=kanal_tab.ref(2);
        id2:=kanal_tab.ref(3);
        write(z,"nl",1,"sp",4,
          <<-d>,i,<<-ddddd>,t shift(-20),t shift(-16) extract 4,
          t shift(-6) extract 10,"sp",3);
        for j:=5 step -1 until 2 do
          write(z,if læsbit_i(t,j) then "X" else "sp",1,"sp",1);
        write(z,"sp",1,case t extract 2 +1 of
             (<: -  :>,<:OPK :>,<:MEDD:>,<:GNM :>),
          "sp",4);
        skriv_id(z,id1,9);
        skriv_id(z,id2,9);
        t:=kanal_tab.ref(4);
        write(z,"sp",1,<<-dddd>,t,t shift(-16),-(t extract 8));
      end;
      write(z,"nl",2,<:kanalflag::>);
      outintbits(z,kanalflag);
      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  :>,"nl",1);
      for i:= 1 step 1 until max_antal_mobilopkald do
      begin
        ref:= i*opkaldskø_postlængde;
        j:= opkaldskø.ref(1);
        write(z,<< ddd>,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 shift (-8) extract 4,j shift (-4) extract 4);
        j:= j 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);
        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::>);
        outintbits(z,opkalds_flag);
        write(z,"nl",2);
    end skriv_opkaldskø;
\f

message procedure skriv_radio_linie_tabel 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æs_hex_ciffer(radio_linie_tabel,i,j);
        if j > 0 then
        begin
          k:= k +1;
          write(z,<<dddd>,i,":",1,<<z_>,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_linie_tabel;

procedure skriv_radio_garagetabel(z);
 zone                             z;
  begin
    integer i;

    write(z,"nl",2,"*",5,<: garagefordeling for operatører :>,"*",5,"nl",2);
    for i:= 1 step 1 until max_antal_garager do
    begin
      laf:= (i-1)*4;
      if radio_garagetabel(i)<>0 then
        write(z,<<dd>,i,<:. :>,garagenavn.laf,<:: :>,
          radio_garagetabel(i),"nl",1);
    end;
  end skriv_radio_garagetabel;

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 k = 70  or (72<=k and k<=74) or k = 77
         <*IN,O/EK,O/IN,R/EK,R/FO,L/FO,G/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(operatør,op);
  value           operatør,op;
  integer         operatør,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;
      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,
              <:samtalekø=:>);
            out_int_bits(z,samtalekø);
            skriv_coru(z,coru_no(410+operatør));
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;

      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) shift (-4) extract 4;
          if nr*(operatør_maske shift(-nr) extract 1) = 0 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 shift(-4) extract 4;
          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) shift(-4) extract 4; <*operatør*>
          if <*(j*operatørmaske shift(-nr) extract 1 = 0
             or j = operatør) and*>
             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 shift(-4) extract 4;
          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ø:>,0);
<*-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_i(operatør_maske,o) or o = 0 then
          opkaldsflag:= -1 extract max_antal_operatører shift 1
        else
        begin
          sætbit_i(opkaldsflag,operatør,1);
          sætbit_i(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+operatør,cs_radio(operatør),
          if id1 shift (-22) = 2 then 18 else 17);
        d.vt_op.data(1):= id1;
        d.vt_op.data(2):= omr;
        signalch(cs_vt,vt_op,vt_optype or genoptype);
<*V*>   waitch(cs_radio(operatør),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+operatør,cs_radio(operatør),
          if id2 shift (-22) = 2 then 18 else 17);
        d.vt_op.data(1):= id2;
        d.vt_op.data(2):= omr;
        signalch(cs_vt,vt_op,vt_optype or genoptype);
<*V*>   waitch(cs_radio(operatør),vt_op,vt_optype,-1);
        signalch(cs_vt_adgang,vt_op,true);
      end;

      kanaltab.iaf.kanal_id1:= kanaltab.iaf.kanal_id2:= 
      kanaltab.iaf.kanal_alt_id1:= kanaltab.iaf.kanal_alt_id2:= 0;
      kanal_tab.iaf.kanaltilstand:= kanal_tab.iaf.kanaltilstand
                                    shift (-12) extract 8 shift 12;
      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(operatør,op,retursem,flash);
value                     operatør,op,retursem,flash;
integer                   operatør,op,retursem;
boolean                                        flash;
begin
  integer array field opref;

  opref:= op;
  start_operation(opref,410+operatør,retursem,'A' shift 12 + 60);
  d.opref.data(1):= operatør;
  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(operatør,op,retursem);
  value                  operatør,op,retursem;
  integer                operatør,op,retursem;
begin
  integer i,res;
  integer array field opref;

 if læsbiti(hookoff_maske,operatør) then
 begin
  inspect(bs_operatør_udkoblet(operatør),i);
  if i<=0 then
  begin
    opref:= op;
    start_operation(opref,410+operatør,retursem,'D' shift 12 + 60);
    d.opref.data(1):= operatør;
    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_operatør_udkoblet(operatør));
 end
 else
   res:= 0;

 sætbiti(hookoff_maske,operatør,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) +50);

<*+2*>if testbit32 and overvåget or testbit28 then
        skriv_radio(out,0);
<*-2*>
      repeat
        waitch(cs_radio(operatør),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(operatør));
          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(1);

<*+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;

          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+operatør,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 kanaltab.iaf(1) extract 2<>0 and 
               kanaltab.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+operatør,cs_radio(operatør),
              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(operatør),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(operatør,rad_op,cs_radio(operatør),
                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+operatør,cs_radio(operatør),
                'H' shift 12 + 60);
              d.rad_op.data(1):= operatør;
              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(operatør),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+operatør,cs_radio(operatør),
              'B' shift 12 + 60);
            d.rad_op.data(1):= operatør;
            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(operatør),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 then tæl_opkald(j,1);

                  iaf:= (i-1)*kanalbeskrlængde;
                  sæt_hex_ciffer(kanal_tab.iaf,5,operatør);
                  kanaltab.iaf.kanal_id2:= kanaltab.iaf.kanal_id1;
                  kanaltab.iaf.kanal_alt_id2:= kanaltab.iaf.kanal_alt_id1;
                  kanaltab.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);
                  kanaltab.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 kanaltab.iaf(2)=0 then kanaltab.iaf(2):= 10000;
                  kanaltab.iaf(4):= if opgave <= 2 or opgave = 9 then
                    ttmm else 0;
                end;
              end;
              if 5<=opgave and opgave<=8 <*alle-/katastrofekald*> then
                sætbiti(kanalflag,operatør,1);
\f

message procedure radio side 7 - 880930/cl;

            end
            else
            begin
              d.opref.resultat:= res;
              if d.opref.data(6)=0 then
              res:= hookon(operatør,rad_op,cs_radio(operatør));
              <* 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+operatør,cs_radio(operatør),
                  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(operatør),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 kanaltab.iaf(3) shift (-20) = 12 then
                  kanaltab.iaf(3) extract 20
                else
                if kanaltab.iaf(3)<>0 then nr else 0;
            if k<>0 then inspect(ss_samtale_nedlagt(k),j) else j:=0;
            if kanaltab.iaf(1) shift (-20) = operatør 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_i(kanalflag,operatør,1);
              goto radio_nedlæg;
            end
            else
            if i<>0 or j<>0 then
              res:= 49
            else
            if kanaltab.iaf(1) extract 2 = 0 then
              res:= 49 <* ingen samtale igang *>
            else
            begin
              res:= hookoff(operatør,rad_op,cs_radio(operatør),false);
              if res=0 then
              begin
                start_operation(rad_op,410+operatør,cs_radio(operatør),
                  'B' shift 12 + 60);
                d.rad_op.data(1):= operatør;
                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(operatør),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(1) extract 12;
                  res:= 3;
                end;
              end;
            end;
\f

message procedure radio side 9 - 880930/cl;
            if res=3 then
            begin
              if kanal_tab.iaf(1) shift (-20) = operatør then
                sætbiti(kanal_tab.iaf(1),5,1) <* monbit *>
              else
                sætbiti(kanal_tab.iaf(5),operatør,1);
              d.opref.data(6):= 12 shift 20 + nr;
              i:= kanal_tab.iaf(3);
              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(1) shift (-20) = operatør then
                    sætbiti(kanal_tab.iaf(1),5,1)
                  else
                    sætbiti(kanal_tab.iaf(5),operatør,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_i(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(operatør,rad_op,cs_radio(operatør));
              goto radio_nedlæg;
            end;

            iaf:= (nr-1)*kanal_beskr_længde;
            if kanal_tab.iaf(1) shift (-20) = operatør then
            begin
              if læsbiti(kanal_tab.iaf(1),5) and
                 kanal_tab.iaf(1) extract 2 = 3
              then
                res:= hookoff(operatør,rad_op,cs_radio(operatør),true)
              else
              if kanal_tab.iaf(1) 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(operatør,rad_op,cs_radio(operatør));
            if res=0 then
            begin
              sætbiti(kanal_tab.iaf(1),5,0);
              kanal_tab.iaf(1):= kanal_tab.iaf(1) shift (-2) shift 2 + 3;
              d.opref.data(6):= 0;
              if kanaltab.iaf(3)=0 then
                kanaltab.iaf(3):= d.opref.data(5);

              if kanal_tab.iaf(3) shift (-22) = 3 then
              begin <* gennemstillet til anden kanal *>
                iaf1:= ((kanal_tab.iaf(3) extract 20) - 1)*kanalbeskrlængde;
                sætbiti(kanal_tab.iaf1(1),5,0);
                kanal_tab.iaf1(1):= kanal_tab.iaf1(1) shift (-2) shift 2 + 3;
                if kanaltab.iaf1(3)=0 then
                  kanaltab.iaf1(3):= 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(operatør,rad_op,cs_radio(operatør));
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 kanaltab.iaf(1) shift (-20) = operatør then
                  frigiv_kanal(d.opref.data(k) extract 20)
                else
                  sætbiti(kanaltab.iaf(5),operatør,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 kanaltab.iaf(1) shift (-20) = operatør then
                      frigiv_kanal(i)
                    else
                      sætbiti(kanaltab.iaf(5),operatør,0);
                  end;
                sætbiti(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+operatør,cs_radio(operatør),
              'H' shift 12 + 60);
            d.rad_op.data(1):= operatør;
            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(operatør),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(operatør,radop,cs_radio(operatør));
                goto radio_nedlæg;
              end;

              res:= hookoff(operatør,radop,cs_radio(operatør),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, 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 i;
          disable i:=write(zud,"nl",1,<:+++ radio-ind ::>);
          if omfang > 0 then
          disable begin integer x; long array field tx;
            tx:= 0;
            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,
              <:  filref       :>,filref,"nl",1,
              <:  zno:         :>,zno,"nl",1,
              <:  answ:        :>,answ.tx,"nl",1,
              <:  tlgr:        :>,tlgr.tx,"nl",1);
            trap(slut);
            skriv_coru(zud,coru_no(401));
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æs_hex_ciffer(radio_linietabel,ll shift(-12) extract 10,
                           operatør);
            if operatør < 0 or max_antal_operatører < operatør then
              operatør:= 0;
            if operatør=0 then
              operatør:= radio_garagetabel(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*(operatør_maske shift(-operatør) extract 1) =0 then
              opkaldsflag:= -1 extract max_antal_operatører shift 1
            else sæt_bit_i(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 +operatør shift 4 +type extract 4;
            opkaldskø.ref(5):= sig shift 20 + omr;
            opkaldskø.ref(6):= 0;
            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*> waitch(cs_rad_ind_input,io_opref,rad_optype,-1);
  ac:= d.io_opref.resultat;
  tofrom(tlgr,d.io_opref.data,64);
  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;

  start_operation(io_opref,401,cs_rad_ind_input,47);
  signalch(cs_radio_input(1),io_opref,rad_optype);

  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) shift (-4) extract 4;
      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æsbiti(operatør_maske,o) or o=0 then
        opkaldsflag:= (-1) extract max_antal_operatører shift 1
      else
      begin
        sætbiti(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;
      start_operation(io_opref,401,cs_rad_ind_input,47);
      signal_ch(cs_radio_input(1),io_opref,rad_optype);


      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_operatører 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ætbiti(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,false add 128,1);
<*+2*>      if (testbit36 or testbit38) and overvåget then
            disable begin
              write(out,<:fr-answ: :>,answ.laf);
              ud;
            end;
<*-2*>
            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_operatører 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(out,<:fr-answ: :>,answ.laf); ud;
                  end;
<*-2*>
                  write(z_fr_out,"nl",1,answ.laf,"cr",1,false add 128,1);
                  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(out,<:fr-answ: :>,answ.laf); ud;
                    end;
<*-2*>
                    write(z_fr_out,"nl",1,answ.laf,"cr",1,false add 128,1);
                    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(out,<:fr-answ: :>,answ.laf);
                ud;
              end;
<*-2*>
              write(z_fr_out,"nl",1,answ.laf,"cr",1,false add 128,1);
              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_operatører 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(out,<:fr-answ: :>,answ.laf); ud;
            end;
<*-2*>
            write(z_fr_out,"nl",1,answ.laf,"cr",1,false add 128,1);
            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_operatører then
                ac:= 1
              else
              begin
                inspect(bs_operatør_udkoblet(pnum),j);
                if j>=0 then
                begin
                  sætbiti(samtalekø,pnum,1);
                  signal_bin(bs_mobil_opkald);
                end;
                if læsbiti(hookoff_maske,pnum) then
                  signalbin(bs_operatør_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);
                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;
                  inspect(ss_samtale_nedlagt(j),i);
                  if i>=0 then
                  begin
                    sætbiti(samtalekø,kanaltab.ref(1) shift (-20),1);
                    signalbin(bs_mobil_opkald);
                  end;
                  signal(ss_samtale_nedlagt(j));
                  if b_pn<>0 then frigiv_id(b_pn,b_pt);
                  begin
                    ref:= (j-1)*kanal_beskr_længde;
                    if kanaltab.ref.kanal_id1<>0 and
                      (kanaltab.ref.kanal_id1 shift (-22)<>0 or
                       kanaltab.ref.kanal_id1 extract 14<>b_pn) then
                      frigiv_id(kanaltab.ref.kanal_id1,b_pt);
                    if kanaltab.ref.kanal_id2<>0 and
                      (kanaltab.ref.kanal_id2 shift (-22)<>0 or
                       kanaltab.ref.kanal_id2 extract 14<>b_pn) then
                      frigiv_id(kanaltab.ref.kanal_id2,b_pt);
                  end;
                  sætbiti(optaget_flag,j,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(out,<:fr-answ: :>,answ.laf); ud;
              end;
<*-2*>
              write(z_fr_out,"nl",1,answ.laf,"cr",1,false add 128,1);
              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 *>
              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;
              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(kanaltab.ref,4,bs) then
                begin
                  kanalflag:= ((-1) extract max_antal_operatører) shift 1; 
                  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));
                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;
                kanaltab.ref.kanal_alarm:= kanalflag:=
                  ((-1) extract max_antal_operatører) shift 1;
                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(kanaltab.ref(1),15,bs extract 1);
              end;
              kanalflag:= -1 extract max_antal_operatører shift 1;
              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(out,<:fr-answ: :>,answ.laf); ud;
            end;
<*-2*>
            write(z_fr_out,"nl",1,answ.laf,"cr",1,false add 128,1);
            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_operatører do
              if læsbiti(hookoff_maske,i) then
              begin
                signalbin(bs_operatør_udkoblet(i));
                sætbiti(samtalekø,i,1);
              end;
            if samtalekø<>0 then signal_bin(bs_mobil_opkald);
            for i:= 1 step 1 until max_antal_kanaler do
            begin
              ref:= (i-1)*kanalbeskrlængde;
              if kanaltab.ref.kanaltilstand extract 2 <> 0 then
              begin
                if kanaltab.ref.kanal_id2<>0 and
                   kanaltab.ref.kanal_id2 shift (-22)<>3
                then
                begin
                  signal(ss_samtale_nedlagt(i));
                  frigiv_id(kanaltab.ref.kanal_id2,kanal_til_omr(i));
                end;
                if kanaltab.ref.kanal_id1<>0 then
                begin
                  signal(ss_samtale_nedlagt(i));
                  frigiv_id(kanaltab.ref.kanal_id1,kanal_til_omr(i));
                end;
              end;
              sæt_hex_ciffer(kanaltab.ref,4,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(out,<:fr-answ: :>,answ.laf); ud;
            end;
<*-2*>
            write(z_fr_out,"nl",1,answ.laf,"cr",1,false add 128,1);
            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;
            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
          else
          if ttyp='Z' then
          begin
<*+2*>      if (testbit36 or testbit38) and overvåget then
            disable begin
              write(out,<:fr-answ: :>,answ.laf); ud;
            end;
<*-2*>
            write(z_fr_out,"nl",1,answ.laf,"cr",1,false add 128,1);
            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(out,<:fr-answ: :>,answ.laf); ud;
          end;
<*-2*>
          write(z_fr_out,"nl",1,answ.laf,"cr",1,false add 128,1);
          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;
            trap(slut);
           skriv_coru(z,coru_no(402));
slut:
         end; <*disable*>
       end skriv_radio_ud;

      procedure flush;
      begin
        integer i;

        repeat
          inspectch(cs_radio_input(2),true,i);
          if i < 0 then <* nogen venter *>
          begin
            startoperation(io_opref,402,cs_rad_ud_input,47);
            signalch(cs_radio_input(2),io_opref,rad_optype);
<*V*>       waitch(cs_rad_ud_input,io_opref,rad_optype,-1);
          end;
        until i=0;
      end;

      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)+'@'); <*operatørnr*>
            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 0 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;

<*+2*>    if (testbit36 or testbit39) and overvåget then
          disable begin
            write(out,<:rf-tlgr: :>,tlgr.laf);
            ud;
          end;
<*-2*>
          flush;
          write(z_rf_out,"nl",1,tlgr.laf,"cr",1,false add 128,1);
          setposition(z_rf_out,0,0);
          rc:= 0;

          <* afvent svar*>
          repeat
            start_operation(io_opref,402,cs_rad_ud_input,47);
            signalch(cs_radio_input(2),io_opref,rad_optype);
<*V*>       waitch(cs_rad_ud_input,io_opref,rad_optype,-1);
            svar_status:= d.io_opref.resultat;
            if svar_status=6 then
            begin
              svar_status:= -3;
              goto radio_ud_check;
            end;
            tofrom(answ,d.io_opref.data,64);
            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:
            if svar_status<>0 then flush;
            rc:= rc+1;
            if -4<=svar_status and svar_status<=-1 then
            disable begin
              write(z_rf_out,<:<'nl'>Z@@MJ<'cr'>:>,false add 128,1);
              setposition(z_rf_out,0,0);
<*+2*>        if (testbit36 or testbit39) and overvåget then
              begin
                write(out,<:rf-tlgr: Z@@MJ:>); ud;
              end;
<*-2*>
            end
            else
            if svar_status=6 then
            disable begin
              write(z_rf_out,"nl",1,tlgr.laf,"cr",1,false add 128,1);
              setposition(z_rf_out,0,0);
<*+2*>        if (testbit36 or testbit39) and overvåget then
              begin
                write(out,<:rf-tlgr: :>,tlgr.laf,<: (repeat):>); ud;
              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::>);
          out_int_bits(out,opkaldsflag);
          write(out,"nl",1,<:kanalflag:  :>);
          outintbits(out,kanalflag);
          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,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,
              <:  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;
      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);
      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:= 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  *> or k = 70<*FO,G*> then
        begin
          if k = 5 or k=70 or k=77 then
          begin

<*V*>       wait(bs_opkaldskø_adgang);
            if k=5 then
            begin

              disable i:= læs_fil(1029,1,nr);
              if i <> 0 then
                fejlreaktion(5<*læs_fil*>,i,<:liniefordelingstabel:>,0);

              tofrom(radio_linie_tabel,fil(nr),(max_linienr//6+1)*2);

              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*>
                læs_hex_ciffer(radio_linie_tabel,nr,operatør);
                if operatør>max_antal_operatører then operatør:= 0;
                iaf:= iaf +6;
                sæt_hex_ciffer(opkalds_kø.iaf,1,operatør);
              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 læs_hex_ciffer(opkaldskø.iaf,1+18,0)=0 or
                   opkaldskø.iaf(3) shift (-12) extract 10 = 0 then
                     sæt_hex_ciffer(opkaldskø.iaf,1+18,operatør);
              end;
            end
            else

            begin
              disable i:= læsfil(1033,1,nr);
              if i<>0 then fejlreaktion(5,i,<:garagefordelingstabel:>,0);
              tofrom(radio_garagetabel,fil(nr),max_antal_garager*2);
              for i:= 1 step 1 until max_antal_mobilopkald do
              begin
                iaf:= i*opkaldskø_postlængde;
                nr:= opkaldskø.iaf(2) shift (-14) extract 4; <*garage*>
                operatør:= radio_garagetabel(nr);
                if operatør<0 or max_antal_operatører<operatør then
                  operatør:= 0;
                if læs_hex_ciffer(opkaldskø.iaf,1+18,0)=0 or
                   opkaldskø.iaf(3) shift (-12) extract 10 = 0 then
                     sæt_hex_ciffer(opkaldskø.iaf,1+18,operatør);
              end;
            end;

            opkaldsflag:= -1 extract max_antal_operatører shift 1;
            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 = 70*>
          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(1) shift (-20) = operatør then
              begin
                tilst:= kanal_tab.iaf(1) extract 2;
                if tilst <> 0 then
                  res:= 16; <*skærm optaget*>
              end; <* kanaltab(operatør) = operatør*>
            end;
            opkaldsflag:= -1 extract max_antal_operatører shift 1;
            sæt_bit_i(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=70 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=70 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(kanaltab.iaf(1),15) == (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(kanaltab.iaf(1),15,k extract 1);
              sætbiti(kanaltab.iaf(1),14,k extract 1);
            end;
          end;
          d.op_ref.resultat:=res;
          signal_ch(d.op_ref.retur,op_ref,d.op_ref.optype);
          kanal_flag:= -1 extract max_antal_operatører shift 1;
          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(kanaltab.iaf,4,j) then
            begin
              kanalflag:= ((-1) extract max_antal_operatører) shift 1;
              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;
\f

message procedure radio_input side 1 - 891201/cl;

  procedure radio_input(z_in,nr);
    value                    nr;
    zone                z_in;
    integer                  nr;
    begin
      integer array field op_ref;
      integer ac;
      integer array typ, val(1:6), tlgr(1:32);
      real field rf;
      long array field laf;

      procedure skriv_radio_input(zud,omfang);
        value                       omfang;
        zone                    zud;
        integer                     omfang;
        begin integer i;
          disable i:=write(zud,"nl",1,<:+++ radio-input(:>,<<d>,nr,<:)::>);
          if omfang > 0 then
          disable begin integer x; long array field tx;
            tx:= 0;
            write(zud,"nl",1,
              <:  op-ref:      :>,op_ref,"nl",1,
              <:  ac:          :>,ac,"nl",1,
              <:  tlgr:        :>,tlgr.tx,"nl",1);
            trap(slut);
            skriv_coru(zud,coru_no(404+nr));
slut:
          end; <*disable*>
        end skriv_radio_input;
\f

message procedure afvent_telegram side 1 - 880901/cl;

integer procedure afvent_telegram(tlgr);
  integer array                   tlgr;
begin
  integer i, pos, tegn, ac, sum, csum, lgd;
  long array field laf;

  laf:= 0;
  pos:= 1;
  while readchar(z_in,tegn)<8 and pos<80 do
    skrivtegn(tlgr,pos,tegn);
  repeat afsluttext(tlgr,pos) until pos mod 6 = 1;
<*+2*>if overvåget and (testbit36 or (nr=1 and testbit38) or
                       (nr=2 and testbit39)) then
      disable begin
        write(out,case nr of (<:fr-tlgr: :>,<:rf-answ: :>),tlgr.laf,
          if tegn='em' then <:*timeout*:> else
          if pos>=80 then   <:*for langt*:> else <::>); ud; 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
           (nr=1 and testbit38) or (nr=2 and testbit39)) then
        disable begin
          write(out,case nr of (<:fr:>,<:rf:>),
            <:-tlgr-checksumfejl: :>,csum,sum); ud;
        end;
<*-2*>
        ac:= 6 <* checksumfejl *>
      end
      else
        ac:= 0;
    end
    else ac:= 6; <* for kort telegram - retransmitter *>
  end;
  afvent_telegram:= ac;
end;
\f

message procedure radio_input side 2 - 891201/cl;
    trap(radio_input_trap);
    laf:= 0;
    stack_claim((if cm_test then 200 else 150) +135);

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

      repeat
        ac:= afvent_telegram(tlgr);
        if ac = -1 then
        begin <* timeout *>
          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_input(nr),opref,true,typ,val);
            if opref<>0 then
            begin
              d.opref.resultat:= -1; <* annulleret *>
              d.opref.data(1):= d.opref.data(2):= 0;
              signalch(d.opref.retur,opref,d.opref.optype);
            end;
          until opref=0;
        end
        else
        begin
          waitch(cs_radio_input(nr),opref,rad_optype,-1);
          d.opref.resultat:= ac;
          tofrom(d.opref.data,tlgr,64);
          signalch(d.opref.retur,opref,d.opref.optype);
        end;

      until false;

radio_input_trap:
    
      disable skriv_radio_input(zbillede,1);
  
    end radio_input;

: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;
  radio_garagetabel(0):= 0;
  læsfil(1033,1,i);
  tofrom(radio_garagetabel,fil(i),max_antal_garager*2);
  læsfil(1034,1,i);
  tofrom(radio_områdetabel,fil(i),max_antal_områder*2);
  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;

  læs_fil(1029,1,i);
  tofrom(radio_linie_tabel,fil(i),(max_linienr//6 +1)*2);

  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_mon_maske:= 10;
  kanal_alarm:= 12;
  kanal_alt_id1:= 14;
  kanal_alt_id2:= 16;

  for i:= 1 step 1 until max_antal_kanaler do
  begin
    ref:= (i-1)*kanalbeskrlængde;
    sæthexciffer(kanaltab.ref,4,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(kanaltab.ref(1),15,1);
      sætbiti(kanaltab.ref(1),14,1);
    end;
  end;
  opkaldsflag:= -1 extract max_antal_operatører shift 1;
  samtalekø:= 0;
  hookoff_maske:= 0;
  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_operatører do
 begin

  cs_radio(k):=next_semch;

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

  bs_operatør_udkoblet(k):= nextsem;
<*+3*>skriv_new_sem(out,1,bs_operatør_udkoblet(k),<:bs_operatør_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;

  raf:=0;

    open(z_fr_in,0,radio_fr_in_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_in_navn.raf(increase(j)),1)
    else
    begin
      open(z_fr_out,14,radio_fr_out_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_out_navn.raf(increase(j)),1)
      else
      begin
      end;
    end;

    open(z_rf_in,0,radio_rf_in_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_in_navn.raf(increase(j)),1)
    else
    begin
      open(z_rf_out,14,radio_rf_out_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_out_navn.raf(increase(j)),1)
      else
      begin
      end;
    end;
\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;

  for k:= 1, 2 do
  begin
    cs_radio_input(k):= next_semch;
<*+3*>skriv_new_sem(out,3,cs_radio_input(k),<:cs_radio_input(  ):>);
<*-3*>
  end;

  i:= next_coru(405,3,true);
  j:= new_activity(i,0,radio_input,z_fr_in,1);
<*+3*>skriv_newactivity(out,i,j);
<*-3*>

  i:= next_coru(406,3,true);
  j:= new_activity(i,0,radio_input,z_rf_in,2);
<*+3*>skriv_newactivity(out,i,j);
<*-3*>

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

    cs_rad_ind_input:= next_semch;
<*+3*>skriv_new_sem(out,3,cs_rad_ind_input,<:cs_rad_ind_input:>);
<*-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*>

    cs_rad_ud_input:= next_semch;
<*+3*>skriv_new_sem(out,3,cs_rad_ud_input,<:cs_rad_ud_input:>);
<*-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;

  skriv_kanal_tab(zbillede);
  skriv_opkaldskø(zbillede);
  skriv_radio_linietabel(zbillede);
  skriv_radio_garagetabel(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◀