DataMuseum.dk

Presents historical artifacts from the history of:

RC4000/8000/9000

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about RC4000/8000/9000

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download

⟦2781a037f⟧ TextFile

    Length: 774144 (0xbd000)
    Types: TextFile
    Names: »buskom1text «, »buskomtekst «

Derivation

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

TextFile

begin algol list.off;

  <* variables for claiming (accumulating) basic entities *>
  integer maxsem, maxsemch, maxop, maxcoru, maxmessext, maxprocext, maxnettoop;

  <* fields defining current position in pools af basic entities
     during initialization *>
  integer array field firstsem, firstsim, firstcoru, firstop, optop;

  <* variables used as pointers to 'current object' (work variables) *>
  integer messext, procext, timeinterval, testbuffering;
  integer array field timermessage, coru, sem, op, receiver, currevent,
    baseevent, prevevent;

  <* variables defining the size of basic entities (descriptors) *>
  integer corusize, semsize, simsize, opheadsize;
  integer array clockmess(1:2);
  real array clock(1:3);
  boolean eventqueueempty;
algol list.on;

  \f

  message sys_parametererklæringer side 1 - 810127/cl;
  
  boolean testbit0 ,testbit1 ,testbit2 ,testbit3 ,testbit4 ,testbit5 ,
          testbit6 ,testbit7 ,testbit8 ,testbit9 ,testbit10,testbit11,
          testbit12,testbit13,testbit14,testbit15,testbit16,testbit17,
          testbit18,testbit19,testbit20,testbit21,testbit22,testbit23,
          testbit24,testbit25,testbit26,testbit27,testbit28,testbit29,
          testbit30,testbit31,testbit32,testbit33,testbit34,testbit35,
          testbit36,testbit37,testbit38,testbit39,testbit40,testbit41,
          testbit42,testbit43,testbit44,testbit45,testbit46,testbit47;
  boolean cl_overvåget,out_tw_lp,
          cm_test;
  
  integer låsning;
  \f

  message sys_parametererklæringer side 2 - 810310.hko;
  
  <* hjælpevariable *>
  
  integer i,j,k;
  integer array ia(1:32);
  integer array field iaf,ref;
  
  real r;
  real array ra(1:3);
  real array field raf;
  real field rf;
  
  long array la(1:2);
  long array field laf;
  
  procedure ud;
  begin
  <*
    outchar(out,'nl');
    if out_tw_lp then setposition(out,0,0);
  *>
    flushout('nl');
  end;
  \f

  message sys_parametererklæringer side 3 - 810310/hko;
  
  <* hovedmodul_parametre *>
  
  integer
    sys_mod,
    io_mod,
    op_mod,
    gar_mod,
    rad_mod,
    vt_mod;
  
  <* operations_parametre *>
  
  integer field
    kilde,
    retur,
    resultat,
    opkode;
  
  real field
    tid;
  
  integer array field
    data;
  
  boolean
    sys_optype,
    io_optype,
    op_optype,
    gar_optype,
    rad_optype,
    vt_optype,
    gen_optype;
  \f

  message sys_parametererklæringer side 4 - 820301/hko,cl;
  
  <* trimme-variable *>
  
  integer
    max_antal_operatører,
    max_antal_taleveje,
    max_antal_garageterminaler,
    max_antal_garager,
    max_antal_områder,
    max_antal_radiokanaler,
    max_antal_pabx,
    max_antal_kanaler,
    max_antal_mobilopkald,
    min_antal_nødopkald,
    max_antal_grupper,
    max_antal_gruppeopkald,
    max_antal_spring,
    max_antal_busser,
    max_antal_linie_løb,
    max_antal_fejltekster,
    max_linienr,
    op_maske_lgd,
    tv_maske_lgd;
  
  integer array
    konsol_navn,
    taleswitch_in_navn,
    taleswitch_out_navn,
    radio_fr_navn,
    radio_rf_navn(1:4),
    alfabet(0:255);
  
  integer 
    tf_systællere,
    tf_stoptabel,
    tf_bplnavne,
    tf_bpldef,
    tf_alarmlgd;
  \f

  message filparm side 1 - 800529/jg/cl;
  
  integer
    fil_op_længde,
    dbantez,dbantsz,dbanttz,
    dbmaxtf, dbmaxsf, dbblokt,
    dbmaxb,dbbidlængde,dbbidmax,
    dbmaxef;
  long array
    dbsnavn, dbtnavn(1:2);
  
  message attention parametererklæringer side 1 - 810318/hko;
  
    integer
      att_op_længde,
      att_maske_lgd,
      terminal_beskr_længde;
    integer field
      terminal_tilstand,
      terminal_suppl;
  
  message io_parametererklæringer side 1 - 820301/hko;
  
  message operatør_parametererklæringer side 1 - 810422/hko;
  
  integer field
    cqf_bus, cqf_fejl,
    alarm_kmdo, alarm_tilst, alarm_gtilst, alarm_lgd;
  real field
    cqf_ok_tid, cqf_næste_tid,
    alarm_start;
  long field
    cqf_id;
  
  integer  
    max_cqf, cqf_lgd,
    op_spool_postlgd, 
    op_spool_postantal,
    opk_alarm_tab_lgd;
  
  
  \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;
  
  
  \f

  message vogntabel parametererklæringer side 1 - 810309/cl;
  
  integer vt_op_længde, vt_logskift;
  boolean vt_log_aktiv;
  
\f


algol list.off;
message coroutinemonitor - 2 ;

  maxsem:= maxsemch:= maxop:= maxcoru:= maxnettoop:= 0;
  maxmessext:= maxprocext:= 1;
  corusize:= 20;
  simsize:= 6;
  semsize:= 8;
  opheadsize:= 8;
  testbuffering:= 1;
  timeinterval:= 5;
algol list.on;
algol list.on;

  \f

  message sys_parameterinitialisering side 1 - 810305/hko;
  
  copyout;
  
  cl_overvåget:= false;
    getzone6(out,ia);
    out_tw_lp:= ia(1) extract 12 = 8 or ia(1) extract 12 = 14;
  
  testbit0 :=testbit( 0);
  testbit1 :=testbit( 1);
  testbit2 :=testbit( 2);
  testbit3 :=testbit( 3);
  testbit4 :=testbit( 4);
  testbit5 :=testbit( 5);
  testbit6 :=testbit( 6);
  testbit7 :=testbit( 7);
  testbit8 :=testbit( 8);
  testbit9 :=testbit( 9);
  testbit10:=testbit(10);
  testbit11:=testbit(11);
  testbit12:=testbit(12);
  testbit13:=testbit(13);
  testbit14:=testbit(14);
  testbit15:=testbit(15);
  testbit16:=testbit(16);
  testbit17:=testbit(17);
  testbit18:=testbit(18);
  testbit19:=testbit(19);
  testbit20:=testbit(20);
  testbit21:=testbit(21);
  testbit22:=testbit(22);
  testbit23:=testbit(23);
  \f

  message sys_parameterinitialisering side 2 - 810316/cl;
  
  testbit24:=testbit(24);
  testbit25:=testbit(25);
  testbit26:=testbit(26);
  testbit27:=testbit(27);
  testbit28:=testbit(28);
  testbit29:=testbit(29);
  testbit30:=testbit(30);
  testbit31:=testbit(31);
  testbit32:=testbit(32);
  testbit33:=testbit(33);
  testbit34:=testbit(34);
  testbit35:=testbit(35);
  testbit36:=testbit(36);
  testbit37:=testbit(37);
  testbit38:=testbit(38);
  testbit39:=testbit(39);
  testbit40:=testbit(40);
  testbit41:=testbit(41);
  testbit42:=testbit(42);
  testbit43:=testbit(43);
  testbit44:=testbit(44);
  testbit45:=testbit(45);
  testbit46:=testbit(46);
  testbit47:=testbit(47);
  cm_test:= false;
  \f

  message sys_parameterinitialisering side 3 - 810409/cl,hko;
  
    timeinterval:=1; <* tidsinterval for cmon's timeoutinspection *>
  
    if findfpparam(<:låsning:>,true,ia) > 0 then låsning:= ia(1)
    else låsning:= 0;
  \f

  message sys_parameterinitialisering side 4 - 820301/hko/cl;
  
  <* initialisering af hovedmodul_parametre *>
  
    i:=0;   sys_mod:=i;
    i:=i+1; io_mod:=i;
    i:=i+1; op_mod:=i;
    i:=i+1; gar_mod:=i;
    i:=i+1; rad_mod:=i;
    i:=i+1; vt_mod:=i;
  
  <* initialisering af operationstyper *>
  
    sys_optype:=false add (1 shift sys_mod);
    io_optype:= false add (1 shift io_mod);
    op_optype:= false add (1 shift op_mod);
    gar_optype:=false add (1 shift gar_mod);
    rad_optype:=false add (1 shift rad_mod);
    vt_optype:= false add (1 shift vt_mod);
    gen_optype:=false add (1 shift 11);
  
  <* initialisering af fieldvariable for operationer *>
  
    i:=2;    kilde:=i;
    i:=i+4;  tid:=i;
    i:=i+2;  retur:=i;
    i:=i+2;  opkode:=i;
    i:=i+2;  resultat:=i;
    i:=i+0;  data:=i;
  
  <* initialisering af trimme-variable *>
  
    max_antal_operatører:=28; <* hvis > 32 skal tf_systællere udvides *>
    max_antal_taleveje:=12;
    max_antal_garageterminaler:=3;
    max_antal_garager:=99;
    max_antal_radiokanaler:=16;
    max_antal_pabx:=2;
    max_antal_kanaler:=14; <* 1 pabx + 13 radio *>
    max_antal_områder:=11;    <* hvis > 16 skal tf_systællere udvides *>
    max_antal_mobilopkald:=100;
    min_antal_nødopkald:=20;
    max_antal_grupper:=16;
    max_antal_gruppeopkald:=16;
    max_antal_spring:=16;
    max_antal_busser:=2000;
    max_antal_linie_løb:=2000;
    max_antal_fejltekster:=21;
    max_linienr:=999; <*<=999*>
  
    op_maske_lgd:= ((1+max_antal_operatører+23)//24)*2;
    tv_maske_lgd:= ((1+max_antal_taleveje+23)//24)*2;
  \f

  message sys_parameterinitialisering side 5 - 880901/cl;
  
  <* initialisering af konsol-navn *>
    raf:= 0;
    if findfpparam(<:io:>,false,ia)>0 then
    begin
      for i:= 1 step 1 until 4 do konsol_navn(i):= ia(i);
    end
    else
      system(7,0,konsol_navn);
  <*
      movestring(konsol_navn.raf,1,<:console1:>);
  *>
  
    raf:= 0;
  
  <* intialiserning af talevejsswitchens navn *>
  
    movestring(taleswitch_in_navn.raf,1,<:taleswitchi:>);
    movestring(taleswitch_out_navn.raf,1,<:taleswitch:>);
  
  <* initialisering af radiokanalnavne *>
  
    movestring(radio_fr_navn.raf,1,<:radiofr:>);
    movestring(radio_rf_navn.raf,1,<:radiorf:>);
  
  <* initialisering af 'input'-alfabet *>
  
    isotable(alfabet);
    alfabet('esc'):= 8 shift 12 + 'esc';
    <* for i:='a' step 1 until 'å' do alfabet(i):=alfabet(i)-32; *>
    for i:= 128 step 1 until 255 do alfabet(i):= 0 shift 12 + i;
    intable(alfabet);
  
  <* initialsering af tf_systællere *>
  
  tf_systællere:= 1024<*tabelfil*> + 8;
  tf_stoptabel := 1024<*tabelfil*> + 5;
  tf_bpl_navne := 1024<*tabelfil*> + 12;
  tf_bpl_def   := 1024<*tabelfil*> + 13;
  tf_alarmlgd  := 1024<*tabelfil*> + 14;
  
  \f

  message filparminit side 1 - 801030/jg;
  
  fil_op_længde:= data + 18 <*halvord*>;
  
  
  dbantez:=        1;
  dbantsz:=        2;
  dbanttz:=        3;  <* >=2 aht. samtidig tilgang*>
  dbblokt:=        8;
  dbmaxsf:=        7;
  dbbidlængde:=    3;
  dbbidmax:=       5;
  dbmaxb:=   dbmaxsf * dbbidmax;
  dbmaxef:=       12;
  movestring(dbsnavn,1,<:spoolfil:>);
  movestring(dbtnavn,1,<:tabelfil:>);
  if findfpparam(<:tabelfil:>,false,ia)>0 then
    tofrom(dbtnavn,ia,8);
  \f

  message filparminit side 2 - 801030/jg;
  
  
  <* reserver og check spoolfil og tabelfil *>
  begin integer s,i,funk,f;
   zone z(128,1,stderror); integer array tail(1:10);
  
  for f:=1,2 do
  begin
    <*open(z,4,string (case f of(dbsnavn,dbtnavn)),0);*>
    case f of
    begin
      open(z,4,dbsnavn,0);
      open(z,4,dbtnavn,0);
    end;
    for funk:=52<*create*>,8<*reserve*>,42<*lookup*> do
    begin
      s:=monitor(funk,z,i,tail);
      if s<>0 then system(9,funk*100+s,
        case f of(<:<10>spoolfil:>,<:<10>tabelfil:>));
    end;
    case f of begin
      begin integer antseg; <*spoolfil*>
        antseg:=dbmaxb * dbbidlængde;
        if tail(1) < antseg then
        begin
          tail(1):=antseg;
          s:=monitor(44<*change*>,z,i,tail);
          if s<>0 then
            system(9,44*100+s,<:<10>spoolfil:>);
        end;
      end;
      begin <*tabelfil*>
        dbmaxtf:=tail(10);
        if dbmaxtf<1 or dbmaxtf>1023 then 
          system(9,dbmaxtf,<:<10>tabelfil:>);
      end
    end case;
    close(z,false);
  end for;
  end;
  \f

  message attention parameterinitialisering side 1 - 810318/hko;
  
    att_op_længde:= 40;
    att_maske_lgd:=
       (1+max_antal_operatører+max_antal_garageterminaler+1+23)//24*2;
    terminal_beskr_længde:=6;
    terminal_tilstand:= 2;
    terminal_suppl:=4;
  
  message io_parameterinitialisering side 1 - 810421/hko;
  
  
  message operatør_parameterinitialisering side 1 - 810422/hko;
  
  <* felter i cqf_tabel *>
  cqf_lgd:=
  cqf_næste_tid:= 16;
  cqf_ok_tid   := 12;
  cqf_id       :=  8;
  cqf_fejl     :=  4;
  cqf_bus      :=  2;
  
  max_cqf:= 64;
  
  <* felter i opkaldsalarmtabel *>
  alarm_kmdo  := 2;
  alarm_tilst := 4;
  alarm_gtilst:= 6;
  alarm_lgd   := 8;
  alarm_start := 12;
  
  opk_alarm_tab_lgd:= 12;
  op_spool_postantal:= 16;
  op_spool_postlgd:= 64;
  
  
  \f

  message procedure radio_parameterinitialisering side 1 - 810601/hko;
  
      radio_giveup:= 1 shift 21 + 1 shift 9;
      opkaldskø_postlængde:= 10+op_maske_lgd;
      kanal_beskr_længde:= 12+op_maske_lgd+tv_maske_lgd;
      radio_op_længde:= 30*2;
      radio_pulje_størrelse:= 1+max_antal_taleveje;
  
  \f

  message vogntabel parameterinitialisering side 1 - 810309/cl;
  
  vt_op_længde:= data + 16; <* halvord *>
  
  if findfpparam(<:vtlogskift:>,true,ia) > 0 then
    vt_logskift:= ia(1) else vt_logskift:= -1;
  
  vt_log_aktiv:= (vt_logskift >= 0) and (vt_logskift < 240000);
  

    \f

    message filclaim, side 1 - 810202/cl;
    
    maxcoru:= maxcoru+6;
    maxsem:= maxsem+2;
    maxsemch:= maxsemch+6;
    \f

    message attention_claiming side 1 - 810318/hko;
    
    
        maxcoru:=maxcoru+1;
    
        max_op:=max_op +1
                       +max_antal_operatører
                       +max_antal_garageterminaler;
    
        max_nettoop:=maxnettoop+(data+att_op_længde)
                                *(1+max_antal_operatører
                                   +max_antal_garageterminaler);
    
        max_procext:=max_procext+1;
    
        max_sem:= max_sem+1;
    
        max_semch:=maxsemch+1;
    
    
    \f

    message io_claiming side 1 - 810421/hko;
    
      max_coru:= max_coru 
                  + 1  <* hovedmodul io *>
                  + 1  <* io kommando *>
                  + 1  <* io operatørmeddelelser *>
                  + 1  <* io spontane meddelelser *>
                  + 1  <* io spoolkorutine *>
                  + 1  <* io tællernulstilling *>
                  ;
    
      max_semch:= max_semch 
                  + 1  <* cs_io *>
                  + 1  <* cs_io_komm *>
                  + 1  <* cs_io_fil  *>
                  + 1  <* cs_io_medd *>
                  + 1  <* cs_io_spool *>
                  + 1  <* cs_io_nulstil *>
                  ;
    
      max_sem:= max_sem
                + 1  <* ss_io_spool_fulde *>
                + 1  <* ss_io_spool_tomme *>
                + 1; <* bs_zio_adgang *>
    
      max_op:=max_op
              + 1; <* fil-operation *>
    
      max_nettoop:=max_nettoop
              + (data+18); <* fil-operation *>
    
    \f

    message operatør_claiming side 1 - 810520/hko;
    
      max_coru:= max_coru +1 <* h_op *>
                          +1 <* alarmur *>
                          +1 <* opkaldsalarmer *>
                          +1 <* talevejsswitch *>
                          +1 <* tv_switch_adm *>
                          +1 <* tv_switch_input *>
                          +1 <* op_spool *>
                          +1 <* op_medd  *>
                          +1 <* op_cqftest *>
                          +max_antal_operatører;
      
      max_sem:=  1 <* bs_opk_alarm *>
                +1 <* ss_op_spool_tomme *>
                +1 <* ss_op_spool_fulde *>
                +max_sem;
    
      max_semch:= max_semch +1 <* cs_op *>
                            +1 <* cs_op_retur *> 
                            +1 <* cs_opk_alarm_ur *>
                            +1 <* cs_opk_alarm_ur_ret *>
                            +1 <* cs_opk_alarm *>
                            +1 <* cs_talevejsswitch *>
                            +1 <* cs_tv_switch_adm *>
                            +1 <* cs_tvswitch_adgang *>
                            +1 <* cs_tvswitch_input *>
                            +1 <* cs_op_iomedd *>
                            +1 <* cs_op_spool *>
                            +1 <* cs_op_medd *>
                            +1 <* cs_cqf *>
                            +max_antal_operatører<* cs_operatør *>
                            +max_antal_operatører<* cs_op_fil *>;
    
      max_op:= max_op + 1 <* talevejsoperation *>
                      + 2 <* tv_switch_input *>
                      + 1 <* op_iomedd *>
                      + 1 <* opk_alarm_ur *>
                      + 1 <* op_spool_medd *>
                      + 1 <* op_cqftest *>
                      + max_antal_operatører;
    
      max_netto_op:= filoplængde*max_antal_operatører
                     + data+128 <* talevejsoperation *>
                     + 2*(data+256) <* tv_switch_input *>
                     + 60      <* op_iomedd *>
                     + data    <* opk_alarm_ur *>
                     + data+op_spool_postlgd <* op_spool_med *>
                     + 60      <* op_cqftest *>
                     + max_netto_op;
    
    \f

    message garage_claiming side 1 -810226/hko;
    
      max_coru:= max_coru +1
                          +max_antal_garageterminaler;
    
      max_semch:= max_semch +1
                            +max_antal_garageterminaler;
    
    \f

    message procedure radio_claiming side 1 - 810526/hko;
    
      max_coru:= max_coru
                   +1                         <* hovedmodul radio *>
                   +1                         <* opkaldskø_meddelelse *>
                   +1                         <* radio_adm *>
                   +max_antal_taleveje        <* radio *>
                   +2;                        <* radio ind/-ud*>
    
      max_semch:= max_semch
                   +1                         <* cs_rad *>
                   +max_antal_taleveje        <* cs_radio *>
                   +1                         <* cs_radio_pulje *>
                   +1                         <* cs_radio_kø *>
                   +1                         <* cs_radio_medd *>
                   +1                         <* cs_radio_adm *>
                   +2   ;                     <* cs_radio_ind/-ud *>
    
      max_sem:=
        +1  <* bs_mobil_opkald *>
        +1  <* bs_opkaldskø_adgang *>
        +max_antal_kanaler  <* ss_radio_aktiver *>
        +max_antal_kanaler  <* ss_samtale_nedlagt *>
        +max_antal_taleveje   <* bs_talevej_udkoblet *>
        +max_sem;
    
      max_op:=
         + radio_pulje_størrelse   <* radio_pulje_operationer *>
         + 1                       <* radio_medd *>
         + 1                       <* radio_adm *>
         + max_antal_taleveje      <* operationer for radio *>
         + 2                       <* operationer for radio_ind/-ud *>
         + max_op;
    
      max_netto_op:=
         + radio_pulje_størrelse * 60      <* radio_pulje_operationer *>
         + data + 6                        <* radio_medd *>
         + max_antal_taleveje              <* operationer for radio *>
           * (data + radio_op_længde)
         + data + radio_op_længde          <* operation for radio_adm *>
         + 2*(data + 64)                   <* operationer for radio_ind/-ud *>
         + max_netto_op;
    \f

    message vogntabel_claiming side 1 - 810413/cl;
    
    maxcoru:=  1          <* coroutine h_vogntabel (hovedmodulcoroutine) *>
             + 1          <* coroutine vt_opdater *>
             + 1          <* coroutine vt_tilstand *>
             + 1          <* coroutine vt_rapport *>
             + 1          <* coroutine vt_gruppe *>
             + 1          <* coroutine vt_spring *>
             + 1          <* coroutine vt_auto *>
             + 1          <* coroutine vt_log *>
             + maxcoru;
    
    maxsemch:= 1          <* cs_vt *>
             + 1          <* cs_vt_adgang *>
             + 1          <* cs_vt_logpool *>
             + 1          <* cs_vt_opd *>
             + 1          <* cs_vt_rap *>
             + 1          <* cs_vt_tilst *>
             + 1          <* cs_vtt_auto *>
             + 1          <* cs_vt_grp *>
             + 1          <* cs_vt_spring *>
             + 1          <* cs_vt_log *>
             + 5          <* cs_vt_filretur(coru) *>
             + maxsemch;
    
    maxop:=    1          <* vt_op *>
             + 2          <* vt_log_op *>
             + 6          <* vt_fil_op + radop *>
             + maxop;
    
    maxnettoop:= vt_op_længde * 3    <* vt_op + vt_log_op *>
               + 5*fil_op_længde
               + (if fil_op_længde>(data+20) then fil_op_længde else (data+20))
               + maxnettoop;
    
\f


algol list.off;
message coroutinemonitor - 3 ;

  begin

    <* work variables - primarily used during initialization *>
    integer array field simref, semref, coruref, opref;
    integer proccount, corucount, messcount, cmi, cmj;
    integer array zoneia(1:20);

    <* field variables describing the format of basic entities *>
    integer field
      <* chain head *>
      next, prev,
      <* simple semaphore *>
      simvalue, simcoru,
      <* chained semaphore *>
      semop, semcoru,
      <* coroutine *>
      coruop, corutimerchain, corutimer, corupriority, coruident,
      <* operation head *>
      opnext, opsize;

\f


message coroutinemonitor - 4 ;

    boolean field
      corutypeset, corutestmask, optype;
    real starttime;
    long corustate;

    <* field variables used as queue identifiers (addresses) *>
    integer array field current, readyqueue, idlequeue, timerqueue;

    <* extensions (message- and process- extensions) *>
    integer array messref, messcode, messop (1:maxmessext);
    integer array procref, proccode, procop (1:maxprocext);

    <* core array used for accessing the core using addresses as field 
       variables (as delivered by the monitor functions)
    -  descriptor array 'd' in which all basic entities are allocated
       (except for extensions) *>
    integer array core (1:1), d (1:(4 <* readyqueue *> +
                                    4 <* idlequeue *> +
                                    4 <* timerqueue *> +
                                    maxcoru * corusize +
                                    maxsem * simsize +
                                    maxsemch * semsize +
                                    maxop * opheadsize +
                                    maxnettoop)/2);
\f


message coroutinemonitor - 5 ;



      <*************** initialization procedures ***************>


  
      procedure initchain (chainref);
      value chainref;
      integer array field chainref;
      begin
        integer array field cref;
        cref:= chainref;
        d.cref.next:= d.cref.prev:= cref;
      end;
\f


message coroutinemonitor - 6 ;


      <***** nextsem *****

      this procedure allocates and initializes the next simple semaphore in the
      pool of claimed semaphores.
      the procedure returns the identification (the address) of the semaphore to
      be used when calling 'signal', 'wait' and 'inspect'. *>
  
      integer procedure nextsem;
      begin
        nextsem:= simref;
        if simref >= firstsem then initerror(1, true);
        initchain(simref + simcoru);
        d.simref.simvalue:= 0;
        simref:= simref + simsize;
      end;


      <***** nextsemch *****
   
      this procedure allocates and initializes the next simple semaphore in the
      pool of claimed semaphores.
      the procedure returns the identification (the address) of the semaphore to
      be used when calling 'signalch', 'waitch' and 'inspectch'. *>
  
      integer procedure nextsemch;
      begin
        nextsemch:= semref;
        if semref >= firstop-4 then initerror(2, true);
        initchain(semref + semcoru);
        initchain(semref + semop);
        semref:= semref + semsize;
      end;
\f


message coroutinemonitor - 7 ;


      <***** nextcoru *****

      this procedure initializes the next coroutine description in the pool of
      claimed coroutine descriptions.
      at initialization is defined the priority (an integer value), an identi-
      fication (an integer value 0..8000) and a test pattern (a boolean). *>
  
      integer procedure nextcoru(ident, priority, testmask);
      value ident, priority, testmask;
      integer ident, priority;
      boolean testmask;
      begin
        corucount:= corucount + 1;
        if corucount > maxcoru then initerror(3, true);
        nextcoru:= corucount;
        initchain(coruref + next);
        initchain(coruref + corutimerchain);
        initchain(coruref + coruop);
        d.coruref.corupriority:= priority;
        d.coruref.coruident:= ident * 1000 + corucount;
        d.coruref.corutypeset:= false;
        d.coruref.corutimer:= 0;
        d.coruref.corutestmask:= testmask;
        linkprio(coruref, readyqueue);
        current:= coruref;
        coruref:= coruref + corusize;
      end;
\f


message coroutinemonitor - 8 ;


      <***** nextop *****

      this procedure initializes the next operation in the pool of claimed ope-
      rations (heads and buffers).
      the head is allocated and immediately following the head is allocated 'size'
      halfwords forming the operation buffer.
      the procedure returns an identification of the operation (an address) and
      in case this address is held in a field variable 'op', the buffer area may
      be accessed as:  d.op(1), d.op(2), d.op(3) ...  *>
  
      integer procedure nextop (size);
      value size;
      integer size;
      begin
        nextop:= opref;
        if opref >= optop then initerror(4, true);
        initchain(opref + next);
        d.opref.opsize:= size;
        opref:= opref + size + opheadsize;
      end;
\f


message coroutinemonitor - 9 ;


      <***** nextprocext *****

      this procedure initializes the next process extension in the series of
      claimed process extensions.
      the process description address is put into the process extension and the
      state of the extension is initialized to be closed. *>
  
      integer procedure nextprocext (processref);
      value processref;
      integer processref;
      begin
        proccount:= proccount + 1;
        if proccount >= maxprocext then initerror(5, true);
        nextprocext:= proccount;
        procref(proccount):= processref;
        proccode(proccount):= 1 shift 12;
      end;
\f


message coroutinemonitor - 10 ;


      <***** initerror *****

      this procedure is activated in case the initialized set of resources does
      not match the claimed set.
      in case more resources are claimed than used, a warning is written,
      in case too few resources are claimed, an error message is written and
      the execution is terminated. *>

      procedure initerror (resource, exceeded);
      value resource, exceeded;
      integer resource; boolean exceeded;
      begin
        write(out, false add 10, 1,
           if exceeded then <:more :> else <:less :>,
           case resource of (
             <:simple semaphores:>,
             <:chained semaphores:>,
             <:coroutines:>,
             <:operations:>, 
             <:process extensions:>),
             <: initialized than claimed:>,
           false add 10, 1);
        if exceeded then goto dump;
      end;


      <***** stackclaim *****

      this procedure is used by a coroutine from its first activation to it
      arrives its first waiting point. the procedure is used to claim an addi-
      tional amount of stack space. this must be done because the maximum
      stack space for a coroutine is set to be the max amount used during its
      very first activation. *>


      procedure stackclaim (size);
      value size; integer size;
      begin
        boolean array stackspace (1:size);
      end;
algol list.on;
  
    \f

    message sys_erklæringer side 1 - 810406/cl,hko;
    
    zone
      zdummy(1,1,stderror),
      zrl(128,1,stderror),
      zbillede(128,1,stderror);
    
    real array 
      fejltekst(1:max_antal_fejltekster);
    
    real 
      systællere_nulstillet;
    
    integer
      nulstil_systællere,
      top_bpl_gruppe;
    
    integer array
      ingen_operatører, alle_operatører(1:(op_maske_lgd//2)),
      ingen_taleveje, alle_taleveje(1:(tv_maske_lgd//2)),
      bpl_def(1:(128*(op_maske_lgd//2))),
      bpl_tilst(0:127,1:2),
      operatør_stop(0:max_antal_operatører,0:3),
      område_id(1:max_antal_områder,1:2),
      pabx_id(1:max_antal_pabx),
      radio_id(1:max_antal_radiokanaler),
      kanal_id(1:max_antal_kanaler),
      opkalds_tællere(1:(max_antal_områder*5)),     <* maxantal <= 16 *>
      operatør_tællere(1:(max_antal_operatører*5)); <* maxantal <= 32 *>
    
    boolean array
      operatør_auto_include(1:max_antal_operatører),
      garage_auto_include(1:max_antal_garageterminaler);
    
    long array
      terminal_navn(1:(2*max_antal_operatører)),
      garage_terminal_navn(1:(2*max_antal_garageterminaler)),
      bpl_navn(0:127),
      område_navn(1:max_antal_områder),
      kanal_navn(1:max_antal_kanaler);
    \f

    message procedure findområde side 1 - 880901/cl;
    
    integer procedure find_bpl(navn);
      value                    navn;
      long                     navn;
    begin
      integer i;
    
      find_bpl:= 0;
      for i:= 0 step 1 until 127 do
        if navn = bpl_navn(i) then find_bpl:= i;
    end;
    
    integer procedure findområde(omr);
      value                      omr;
      integer                    omr;
    begin
      integer i;
    
      if omr = '*' shift 16 then findområde:= -1 else
      begin
        findområde:= 0;
        for i:= 1 step 1 until max_antal_områder do
          if (extend omr) shift 24=område_navn(i) then findområde:= i;
      end;
    end;
    \f

    message procedure tæl_opkald side 1 - 880926/cl;
    
    procedure opdater_tf_systællere;
    begin
      integer zi;
      integer array field iaf;
      real field rf;
    
      disable begin
        skrivfil(tf_systællere,1,zi);
        rf:= iaf:= 4;
        fil(zi).rf:= systællere_nulstillet;
        fil(zi).iaf(1):= nulstil_systællere;
        iaf:= 32;
        tofrom(fil(zi).iaf,opkalds_tællere,max_antal_områder*10);
        iaf:= 192;
        tofrom(fil(zi).iaf,operatør_tællere,max_antal_operatører*10);
        setposition(fil(zi),0,0);
      end;
    end;
    
    procedure tæl_opkald(område,type);
      value              område,type;
      integer            område,type;
    begin
      increase(opkalds_tællere((område-1)*5+type));
      disable opdater_tf_systællere;
    end;
                   
    procedure tæl_opkald_pr_operatør(operatør,type);
      value                          operatør,type;
      integer                        operatør,type;
    begin
      increase(operatør_tællere((operatør-1)*5+type));
      disable opdater_tf_systællere;
    end;
    
    procedure skriv_opkaldstællere(z);
      zone                         z;
    begin
      integer omr,typ,rpc;
      integer array ialt(1:5);
      real r;
    
      for typ:= 1 step 1 until 5 do ialt(typ):= 0;
      write(z,"nl",2,<:+++++ opkaldstællere +++++:>,"nl",2,
        <:omr          ud ind-alm ind-nød ej.forb optaget:>,"nl",1);
      for omr:= 1 step 1 until max_antal_områder do
      begin
        write(z,true,6,string område_navn(omr),":",1);
        for typ:= 1 step 1 until 5 do
        begin
          write(z,<< ddddddd>,opkalds_tællere((omr-1)*5+typ));
          ialt(typ):= ialt(typ)+opkalds_tællere((omr-1)*5+typ);
        end;
        outchar(z,'nl');
      end;
      write(z,"-",47,"nl",1,<:I ALT ::>);
      for typ:= 1 step 1 until 5 do
        write(z,<< ddddddd>,ialt(typ));
      outchar(z,'nl');
    
      for typ:= 1 step 1 until 5 do ialt(typ):= 0;
      write(z,"nl",1,        
        <:oper.        ud ind-alm ind-nød ej.forb optaget:>,"nl",1);
      for omr:= 1 step 1 until max_antal_operatører do
      begin
        if bpl_navn(omr)=long<::> then 
          write(z,"sp",6-write(z,<:op:>,<<d>,omr),":",1)
        else
          write(z,true,6,string bpl_navn(omr),":",1);
        for typ:= 1 step 1 until 5 do
        begin
          write(z,<< ddddddd>,operatør_tællere((omr-1)*5+typ));
          ialt(typ):= ialt(typ)+operatør_tællere((omr-1)*5+typ);
        end;
        outchar(z,'nl');
      end;
      write(z,"-",47,"nl",1,<:I ALT ::>);
      for typ:= 1 step 1 until 5 do
        write(z,<< ddddddd>,ialt(typ));
      outchar(z,'nl');
      
      rpc:= replace_char(1,':');
      write(z,"nl",1,<:nulstilles :>);
      if nulstil_systællere = (-1) then write(z,<:ikke automatisk:>,"nl",1)
      else write(z,<:automatisk kl. :>,<<zd dd dd>,nulstil_systællere,"nl",1);
      replace_char(1,'.');
      write(z,<:nulstillet  d. :>,<<zd dd dd>,
        systime(4,systællere_nulstillet,r)," ",1);
      replace_char(1,':');
      write(z,<<zd dd dd>,r,"nl",1);
      replace_char(1,rpc);
    end;
    \f

    message procedure start_operation side 1 - 810521/hko;
    
      procedure start_operation(op_ref,kor,ret_sem,kode);
        value                          kor,ret_sem,kode;
        integer array field     op_ref;
        integer                        kor,ret_sem,kode;
    <*
          op_ref:  kald, reference til operation
    
          kor:     kald, kilde= hovedmodulnr*100 +løbenr
                              = korutineident.
          ret_sem: kald, retursemafor
    
          kode:    kald, suppl shift 12 + operationskode
    
          proceduren initialiserer  en operations hoved med
          parameterværdierne samt tidfeltet med aktueltid.
          resultatfelt og datafelter nulstilles.
    
    *>
        begin
          integer i;
          d.op_ref.kilde:= kor;
          systime(1,0,d.op_ref.tid);
          d.op_ref.retur:=ret_sem;
          d.op_ref.op_kode:=kode;
          d.op_ref.resultat:=0;
          for i:=(d.op_ref.opsize-data)//2 step -1 until 1 do
            d.op_ref.data(i):=0;
        end start_operation;
    \f

    message procedure afslut_operation  side 1 - 810331/hko;
    
    procedure afslut_operation(op_ref,sem);
      value                    op_ref,sem;
      integer                  op_ref,sem;
      begin
        integer array field op;
        op:=op_ref;
        if sem>0 then signal_ch(sem,op,d.op.optype) else
        if sem=-1 then signal_ch(d.op.retur,op,d.op.optype) else
        ;
      end afslut_operation;
    \f

    message procedure fejlreaktion - side 1 - 810424/cl,hko;
    
    procedure fejlreaktion(nr,værdi,str,måde);
      value nr,værdi,måde;
      integer nr,værdi,måde;
      string str;
    begin
    disable begin
      write(out,<:<10>!!! :>);
      if nr>0 and nr <=max_antal_fejltekster then
          write(out,string fejltekst(nr))
      else write(out,<:fejl nr.:>,nr);
      outchar(out,'sp');
      if måde shift (-12) extract 2=1 then
        outintbits(out,værdi)
      else
      if måde shift (-12) extract 2=2 then
        write(out,<:":>,false add værdi,1,<:":>)
      else
        write(out,værdi);
      write(out,"sp",1,str,"nl",1,<< zddddd>,systime(5,0,r),r,
                <: korutine nr=:>,<<d>, abs curr_coruno,
                <: ident=:>,curr_coruid,"nl",0);
      if testbit27 and måde extract 12=1 then
        trace(1);
      ud;
    end;<*disable*>
      if måde extract 12 =2 then trapmode:=1 shift 13;
      if måde extract 12= 0 then trap(-1)
      else if måde extract 12 = 2 then trap(-2);
    end fejlreaktion;
    
    procedure trace(n);
      value         n;
      integer       n;
      begin
        trap(finis);
        trap(n);
    finis:
      end trace;
    \f

    message procedure overvåget side 1 - 810413/cl;
    
    boolean procedure overvåget;
    begin
      disable begin
        integer i,måde;
        integer array field cor;
        integer array ia(1:12);
    
        i:= system(12,0,ia);
        if i > 0 then
        begin
          i:= system(12,1,ia);
          måde:= ia(3);
        end
        else måde:= 0;
    
        if måde<>0 then
        begin
          cor:= coroutine(abs ia(3));
          overvåget:= d.cor.corutestmask shift (-11);
        end
        else overvåget:= cl_overvåget;
      end;
    end;
    \f

    message procedure antal_bits_ia side 1 - 940424/cl;
    
    integer procedure antal_bits_ia(ia,n,ø);
      value                            n,ø;
      integer array                 ia;
      integer                          n,ø;
    begin
      integer i, ant;
    
      ant:= 0;
      for i:= n step 1 until ø do
        if læsbit_ia(ia,i) then ant:= ant+1;
    end;
    
    message procedure trunk_til_omr side 1 - 881006/cl;
    
    integer procedure trunk_til_omr(trunk);
      value trunk; integer trunk;
    begin
      integer i,j;
    
      j:=0;
      for i:= 1 step 1 until max_antal_områder do
        if område_id(i,2) extract 12 = trunk extract 12 then j:=i;
      trunk_til_omr:=j;
    end;
    
    integer procedure omr_til_trunk(omr);
      value omr; integer omr;
    begin
      omr_til_trunk:= område_id(omr,2) extract 12;
    end;
    
    integer procedure port_til_omr(port);
      value port; integer port;
    begin
      if port shift (-6) extract 6 = 2 then
        port_til_omr:= pabx_id(port extract 6)
      else
      if port shift (-6) extract 6 = 3 then
        port_til_omr:= radio_id(port extract 6)
      else
        port_til_omr:= 0;
    end;
    
    integer procedure kanal_til_port(kanal);
      value kanal; integer kanal;
    begin
      kanal_til_port:= kanal_id(kanal) shift (-5) extract 3 shift 6 +
                       kanal_id(kanal) extract 5;
    end;
    
    integer procedure port_til_kanal(port);
      value port; integer port;
    begin
      integer i,j;
    
      j:=0;
      for i:= 1 step 1 until max_antal_kanaler do
        if kanal_id(i) = port shift (-6) shift 5 + port extract 5 then j:=i;
      port_til_kanal:= j;
    end;
    
    integer procedure kanal_til_omr(kanal);
      value kanal; integer kanal;
    begin
      kanal_til_omr:= port_til_omr( kanal_til_port(kanal) );
    end;
    
    \f

    message procedure out_xxx_bits side 1 - 810406/cl;
    
    procedure outboolbits(zud,b);
      value                   b;
      zone                zud;
      boolean                 b;
    begin
      integer i;
    
      for i:= -11 step 1 until 0 do
      outchar(zud,if b shift i then '1' else '.');
    end;
    
    procedure outintbits(zud,j);
      value                  j;
      zone               zud;
      integer                j;
    begin
      integer i;
    
      for i:= -23 step 1 until 0 do
      begin
        outchar(zud,if j shift i extract 1 = 1 then '1' else '.');
        if i<>0 and abs(i) mod 6 = 0 then outchar(zud,'sp');
      end;
    end;
    
    procedure outintbits_ia(zud,ia,n,ø);
      value                        n,ø;
      zone                  zud;
      integer array             ia;
      integer                      n,ø;
    begin
      integer i;
    
      for i:= n step 1 until ø do
      begin
        outintbits(zud,ia(i));
        outchar(zud,'nl');
      end;
    end;
                         
    real procedure now;
    begin
      real f,r,r1; long l;
    
      systime(1,0,r); l:=r*100; f:=(l mod 100)/100;
      systime(4,r,r1);
      now:= r1+f;
    end;
    \f

    message procedure skriv_id side 1 - 820301/cl;
    
    procedure skriv_id(z,id,lgd);
      value              id,lgd;
      integer            id,lgd;
      zone             z;
    begin
      integer type,p,li,lø,bo;
    
      type:= id shift (-22);
      case type+1 of
      begin
        <* 1: bus *>
        begin
          p:= write(z,<<d>,id extract 14);
          if id shift (-14) <> 0 then
            p:= p + write(z,".",1,string bpl_navn(id shift (-14)));
        end;
    
        <* 2: linie/løb *>
        begin
          li:= id shift (-12) extract 10;
          bo:= id shift (-7) extract 5;
          if bo<>0 then bo:= bo + 'A' - 1;
          lø:= id extract 7;
          p:= write(z,<<d>,li,false add bo,(bo<>0) extract 1,"/",1,lø);
        end;
    
        <* 3: gruppe *>
        begin
          if id shift (-21) = 4 <* linie-gruppe *> then
          begin
            li:= id shift (-5) extract 10;
            bo:= id extract 5;
            if bo<>0 then bo:= bo + 'A' - 1;
            p:= write(z,<<d>,li,false add bo,(bo<>0) extract 1);
          end
          else <* special-gruppe *>
            p:= write(z,"G",1,<<d>,id extract 7);
        end;
    
        <* 4: telefon *>
        begin
          bo:= id shift (-20) extract 2;
          li:= id extract 20;
          case bo+1 of
          begin
            p:= write(z,string kanalnavn(li));
            p:= write(z,<:K*:>);
            p:= write(z,<:OMR :>,string områdenavn(li));
            p:= write(z,<:OMR*:>);
          end;
        end;
      end case;
      write(z,"sp",lgd-p);
    end skriv_id;
    <*+3*>
    \f

    message skriv_new_sem side 1 - 810520/cl;
    
    procedure skriv_new_sem(z,type,ref,navn);
      value                   type,ref;
      zone                  z;
      integer                 type,ref;
      string                           navn;
    <* skriver en identifikation af en semafor 'ref' i zonen z.
    
        type:       1=binær sem
                    2=simpel sem
                    3=kædet sem
    
        ref:        semaforreference
    
        navn:       semafornavn, max 18 tegn
    *>
    begin
      disable if testbit29 then
        write(z,"nl",1,"sp",26*(type-1),case type of(<:bs:>,<:ss:>,<:cs:>),
          true,5,<<zddd>,ref,true,19,navn);
    end;
    \f

    message procedure skriv_newactivity  side 1 - 810520/hko/cl;
    
    <**>  procedure skriv_newactivity(zud,actno,cause);
    <**>    value                         actno,cause;
    <**>    zone                      zud;
    <**>    integer                       actno,cause;
    <**>    begin
    <*+2*>
    <**>      if testbit28 then
    <**>      begin integer array field cor;
    <**>        cor:= coroutine(actno);
    <**>        write(zud,<:  coroutine::>,<< dd>,actno,<:  ident::>,
    <**>          << zdd>,d.cor.coruident//1000);
    <**>      end;
    <**>      if -, testbit23 then goto skriv_newact_slut;
    <*-2*>
    <**>      write(zud,"nl",1,<:newactivity(:>,<<d>,actno,
    <**>                <:) cause=:>,<<-d>,cause);
    <**>      if cause<1 then write(zud,<: !!!:>);
    <**>      skriv_coru(zud,actno);
    <**> skriv_newact_slut:
    <**>    end skriv_newactivity;
    <*-3*>
    <*+99*>
    \f

    message procedure skriv_activity  side 1 - 810313/hko;
    
    <**> procedure skriv_activity(zud,actno);
    <**>    value                     actno;
    <**>    zone                  zud;
    <**>    integer                     actno;
    <**>    begin
    <**>      integer i;
    <**>      integer array iact(1:12);
    <**>
    <**>      i:=system(12,actno,iact);
    <**>      write(zud,"nl",1,<:  activity(:>,<<d>,actno,<:) af :>,i,"sp",1,
    <**>                if i=0 then <:neutral:> else (case sign(iact(3))+2 of
    <**>                (<:disable:>,<:monitor:>,<:activity:>)),<: mode:>);
    <**>      if i>0 and actno>0 and actno<=i then
    <**>      begin
    <**>        write(zud,"nl",1,"sp",4,<:tilstand= :>,case iact(8)+1 of
    <**>                  (<:tom:>,<:passivate:>,
    <**>                   <:implicit passivate:>,<:activate:>));
    <**>        if iact(1)<>0 then
    <**>         write(zud,<: ventende på message:>,iact(1));
    <**>        if iact(7)>0 then
    <**>          write(zud,"nl",1,"sp",4,<:virtuel stak::>,iact(7),"sp",2,
    <**>                    <:hovedlager stak benyttes af activity(:>,<<d>,
    <**>                    iact(2));
    <**>        write(zud,"nl",1,"sp",4,<:stak(top,bund,sidst,csr,cza)=:>,
    <**>                  iact(4),iact(5),iact(6),iact(10),iact(11));
    <**>        if iact(9)<> 1 shift 22 then
    <**>           write(zud,"nl",1,"sp",4,<:'head of zonechain'=:>,iact(9));
    <**>         write(zud,"nl",1,"sp",4,<:'trap chain'=:>,iact(12));
    <**>       end;
    <**>     end skriv_activity
    <*-99*>
    <*+98*>
    \f

    message procedure identificer side 1 - 810520/cl;
    
    procedure identificer(z);
      zone                z;
    begin
    disable write(z,<:coroutine::>,<< dd>,curr_coruno,
              <:  ident::>,<< zdd >,curr_coruid);
    end;
    \f

    message procedure skriv_coru  side 1 - 810317/cl;
    
    <**> procedure skriv_coru(zud,cor_no);
    <**>   value                  cor_no;
    <**>   zone               zud;
    <**>   integer                cor_no;
    <**> begin
    <**>   integer i;
    <**>   integer array field cor;
    <**>
    <**>
    <**>   write(zud,"nl",1,<:  coroutine: :>,<<d>,cor_no);
    <**>
    <**>   cor:= coroutine(cor_no);
    <**>   if cor = -1 then
    <**>     write(zud,<: eksisterer ikke !!!:>)
    <**>   else
    <**>   begin
    <**>     write(zud,<:;      ident = :>,<<zdd>,d.cor.coruident//1000,
    <**>       <:      refbyte: :>,<<d>,cor,"nl",1,
    <**>       <:    prev:             :>,<<dddd>,d.cor.prev,"nl",1,
    <**>       <:    next:             :>,d.cor.next,"nl",1,
    <**>       <:    timerchain.prev:  :>,d.cor(corutimerchain//2-1),"nl",1,
    <**>       <:    timerchain.next:  :>,d.cor.corutimerchain,"nl",1,
    <**>       <:    opchain.prev:     :>,d.cor(coruop//2-1),"nl",1,
    <**>       <:    opchain.next:     :>,d.cor.coruop,"nl",1,
    <**>       <:    timer:            :>,d.cor.corutimer,"nl",1,
    <**>       <:    priority:         :>,d.cor.corupriority,"nl",1,
    <**>       <:    typeset:          :>);
    <**>     for i:= -11 step 1 until 0 do
    <**>       write(zud,if d.cor.corutypeset shift i then <:1:> else <:.:>);
    <**>     write(zud,"nl",1,<:    testmask:         :>);
    <**>     for i:= -11 step 1 until 0 do
    <**>       write(zud,if d.cor.corutestmask shift i then <:1:> else <:.:>);
    <*+99*>
    <**>     skriv_activity(zud,cor_no);
    <*-99*>
    <**>   end;
    <**> end skriv_coru;
    <*-98*>
    <*+98*>
    \f

    message procedure skriv_op side 1 - 810409/cl;
    
    <**> procedure skriv_op(zud,opref);
    <**>   value                opref;
    <**>   integer              opref;
    <**>   zone             zud;
    <**> begin
    <**>   integer array field op;
    <**>   real array field raf;
    <**>   integer lgd,i;
    <**>   real t;
    <**>
    <**>   raf:= data;
    <**>   op:= opref;
    <**>   write(zud,"nl",1,<:op:>,<<d>,opref,<:::>);
    <**>   if opref<first_op ! optop<=opref then
    <**>   begin
    <**>     write(zud,<:  !!! illegal reference !!!:>,"nl",1);
    <**>     goto slut_skriv_op;
    <**>   end;
    <**>
    <**>   lgd:= d.op.opsize;
    <**>   write(zud,"nl",1,<<d>,
    <**>     <:  opsize     :>,d.op.opsize,"nl",1,
    <**>     <:  optype     :>);
    <**>   for i:= -11 step 1 until 0 do
    <**>     write(zud,if d.op.optype shift i then <:1:> else <:.:>);
    <**>   write(zud,"nl",1,<<d>,
    <**>     <:  prev       :>,d.op.prev,"nl",1,
    <**>     <:  next       :>,d.op.next);
    <**>   if lgd=0 then goto slut_skriv_op;
    <**>   write(zud,"nl",1,<<d>,
    <**>     <:  kilde      :>,d.op.kilde extract 10,"nl",1,
    <**>     <:  tid        :>,<<zddddd>,systime(4,d.op.tid,t),<:.:>,t,"nl",1,<<d>,
    <**>     <:  retur-sem  :>,if d.op.retur<>0 then <:cs:> else <:--:>,<<b>,
                               d.op.retur,"nl",1,
    <**>     <:  opkode     :>,<<b>,d.op.opkode shift (-12),"sp",1,<<d>,
    <**>                       d.op.opkode extract 12,"nl",1,
    <**>     <:  resultat   :>,d.op.resultat,"nl",2,
    <**>     <:data::>);
    <**>   skriv_hele(zud,d.op.raf,lgd-data,1278);
    <**>slut_skriv_op:
    <**> end skriv_op;
    <*-98*>
    \f

    message procedure corutable side 1 - 810406/cl;
    
    procedure corutable(zud);
      zone              zud;
    begin
      integer i;
      integer array field cor;
    
      write(zud,"ff",1,<:***** coroutines *****:>,"nl",2,
        <:no  id  ref   chain    timerch   opchain  timer pr:>,
        <:    typeset    testmask:>,"nl",2);
      for i:= 1 step 1 until maxcoru do
      begin
        cor:= coroutine(i);
        write(zud,<<zd>,i,<< zdd>,d.cor.coruident//1000,<< dddd>,cor,
          d.cor.prev,d.cor.next,d.cor(corutimerchain//2-1),
          d.cor.corutimerchain,d.cor(coruop//2-1),d.cor.coruop,<< ddddd>,
          d.cor.corutimer,<< dd>,d.cor.corupriority);
        outchar(zud,'sp');
        outboolbits(zud,d.cor.corutypeset);
        outchar(zud,'sp');
        outboolbits(zud,d.cor.corutestmask);
        outchar(zud,'nl');
      end;
    end;
    \f

    message filglobal side 1 - 790302/jg;
    
    integer
      dbantsf,dbkatsfri,
      dbantb,dbkatbfri,
      dbantef,dbkatefri,
      dbsidstesz,dbsidstetz,
      dbsegmax,
      filskrevet,fillæst;
    integer
      bs_kats_fri, bs_kate_fri,
      cs_opret_fil, cs_tilknyt_fil,
      cs_frigiv_fil, cs_slet_fil,
      cs_opret_spoolfil, cs_opret_eksternfil;
    integer array
      dbkatt(1:dbmaxtf,1:2),
      dbkats(1:dbmaxsf,1:2),
      dbkate(1:dbmaxef,1:6),
      dbkatz(1:dbantez+dbantsz+dbanttz,1:2);
    boolean array
      dbkatb(1:dbmaxb);
    zone array
      fil(dbantez+dbantsz+dbanttz,128,1,stderror);
    \f

    message hentfildim side 1 - 781120/jg;
    
    
    integer procedure hentfildim(fdim);
    integer array fdim;
    <*inddata filref i fdim(4),uddata fdim(1:8)*>
    
    begin integer ftype,fno,katf,i,s;
      ftype:=fdim(4) shift (-10);
      fno:=fdim(4) extract 10;
      if ftype>3 or ftype=0 or fno=0 then
        begin s:=1; goto udgang; end;
      if fno>(case ftype of(dbmaxtf,dbmaxsf,dbmaxef)) then
        begin s:=1; goto udgang end; <*paramfejl*>
      katf:=case ftype of(dbkatt(fno,1),dbkats(fno,1),dbkate(fno,1));
      if katf extract 9 = 0 then
        begin s:=2; goto udgang end; <*tom indgang*>
    
      fdim(1):=katf shift (-9); <*post antal*>
      fdim(2):=katf extract 9;  <*post længde*>
      fdim(3):=case ftype of(   <*seg antal*>
        dbkatt(fno,2) extract 18 - (if fno=1 then dbblokt else dbkatt(fno-1,2)
        extract 18), dbkats(fno,2) shift (-12) extract 6 * dbbidlængde,
        dbkate(fno,2) extract 18);
      for i:=5 step 1 until 8 do <*externt filnavn*>
        fdim(i):=if ftype=3 then dbkate(fno,i-2) else 0;
      s:=0;
    udgang:
      hentfildim:=s;
    <*+2*>
    <*tz*> if testbit24 and overvåget then                         <*zt*>
    <*tz*>   begin                                                 <*zt*>
    <*tz*>     write(out,<:<10>hentfildim::>,s,<: :>);             <*zt*>
    <*tz*>     pfdim(fdim);                                        <*zt*>
    <*tz*>     ud;                                                 <*zt*>
    <*tz*>   end;                                                  <*zt*>
    <*-2*>
    end hentfildim;
    \f

    message sætfildim side 1 - 780916/jg;
    
    integer procedure sætfildim(fdim);
    integer array fdim;
    <*inddata fdim(1:4), segant ingen effekt for tabel- og spoolfil*>
    
    begin
      integer ftype,fno,katf,s,pl;
      integer array gdim(1:8);
      gdim(4):=fdim(4);
      s:=hentfildim(gdim);
      if s>0 then
        goto udgang;
      fno:=fdim(4) extract 10;
      ftype:=fdim(4) shift (-10);
      pl:= fdim(2) extract 12;
      if fdim(1)<0 or pl<1 or pl>256 or fdim(3)<0 then
        begin
          s:=1; <*parameter fejl*>
          goto udgang
        end;
      if fdim(1)>256//pl*fdim(3) then
        begin
          s:=1;
          goto udgang;
        end;
    
      <*segant*>
      if ftype=3 then
        begin integer segant;
          segant:= fdim(3);
          if segant > dbsegmax then
            begin
              s:=4; <*ingen plads*>
              goto udgang
            end;
    \f

    message sætfildim side 2 - 780916/jg;
    
    
          if segant<>gdim(3) then
            begin integer i,z,s; array field enavn; integer array tail(1:10);
              z:=dbkate(fno,2) shift (-19); if z>0 then begin
              if dbkatz(z,1) extract 12=fdim(4) then <*zone tilknyttet*>
                begin integer array zd(1:20);
                  getzone6(fil(z),zd);
                  if zd(13)>5 and zd(9)>=segant then
                    begin <*dødt segment skal ikke udskrives*>
                      zd(13):=5;
                      setzone6(fil(z),zd)
                    end
                end end;
    \f

    message sætfildim side 3 - 801031/jg;
    
    
              enavn:=8;  <*ændr fil størrelse*>
              i:=1;
              open(zdummy,0,string gdim.enavn(increase(i)),0);
              s:=monitor(42,zdummy,0,tail); <*lookup*>
              if s>0 then
                fejlreaktion(1,s,<:lookup entry:>,0);
              tail(1):=segant;
              s:=monitor(44,zdummy,0,tail); <*change entry*>
              close(zdummy,false);
              if s<>0 then
                begin
                if s=6 then
                  begin  <*ingen plads*>
                    s:=4; goto udgang
                  end
                else fejlreaktion(1,s,<:change entry:>,0);
                end;
              dbkate(fno,2):=dbkate(fno,2) shift (-18) shift (18)
                add segant;
    \f

    message sætfildim side 4 - 801013/jg;
    
    
            end;
          fdim(3):=segant
        end
      else
        if fdim(3)>gdim(3) then
          begin
            s:=4; <*altid ingen plads*>
            goto udgang
          end
        else fdim(3):=gdim(3); <*samme længde*>
      <*postantal,postlængde*>
      katf:=fdim(1) shift 9  add pl;
      case ftype of begin
        dbkatt(fno,1):=katf;
        dbkats(fno,1):=katf;
        dbkate(fno,1):=katf end;
    udgang:
      sætfildim:=s;
    <*+2*>
    <*tz*> if testbit24 and overvåget then                          <*zt*>
    <*tz*>   begin integer i;                                       <*zt*>
    <*tz*>     write(out,<:<10>sætfildim::>,s,<: :>);               <*zt*>
    <*tz*>     for i:=1 step 1 until 3 do gdim(i):=fdim(i);         <*zt*>
    <*tz*>     pfdim(gdim);                                         <*zt*>
    <*tz*>     ud;                                                  <*zt*>
    <*tz*>   end;                                                   <*zt*>
    <*-2*>
    end sætfildim;
    \f

    message findfilenavn side 1 - 780916/jg;
    
    integer procedure findfilenavn(navn);
    real array navn;
    
    begin
      integer fno; array field enavn;
      for fno:=1 step 1 until dbmaxef do
       if dbkate(fno,1) extract 9>0 then <*optaget indgang*>
          begin
            enavn:=fno*12+4;
            if navn(1)=dbkate.enavn(1) and
               navn(2)=dbkate.enavn(2) then
              begin
                findfilenavn:=fno;
                goto udgang
              end
          end;
      findfilenavn:=0;
    udgang:
    end findfilenavn;
    \f

    message læsfil side 1 - 781120/jg;
    
    integer procedure læsfil(filref,postindex,zoneno);
    value filref,postindex;
    integer filref,postindex,zoneno;
    <*+2*>
    <*tz*> begin integer i,o,s;                                       <*zt*>
    <*tz*> i:=fillæst;o:=filskrevet; s:=                              <*zt*>
    <*-2*>
    
    læsfil:=tilgangfil(filref,postindex,zoneno,5);
    
    <*+2*>
    <*tz*> if testbit24 and overvåget then                            <*zt*>
    <*tz*>   begin                                                    <*zt*>
    <*tz*>     write(out,<:<10>læsfil::>,s,filref,postindex,zoneno,   <*zt*>
    <*tz*>     <: io::>,fillæst-i,filskrevet-o);ud;                   <*zt*>
    <*tz*>   end;                                                     <*zt*>
    <*tz*> end procedure;                                             <*zt*>
    <*-2*>
    \f

    message skrivfil side 1 - 781120/jg;
    
    integer procedure skrivfil(filref,postindex,zoneno);
    value filref,postindex;
    integer filref,postindex,zoneno;
    <*+2*>
    <*tz*> begin integer i,o,s;                                       <*zt*>
    <*tz*> i:=fillæst;o:=filskrevet; s:=                              <*zt*>
    <*-2*>
    
    skrivfil:=tilgangfil(filref,postindex,zoneno,6);
    
    <*+2*>
    <*tz*> if testbit24 and overvåget then                            <*zt*>
    <*tz*>   begin                                                    <*zt*>
    <*tz*>     write(out,<:<10>skrivfil::>,s,filref,postindex,zoneno, <*zt*>
    <*tz*>     <: io::>,fillæst-i,filskrevet-o);ud;                   <*zt*>
    <*tz*>   end;                                                     <*zt*>
    <*tz*> end procedure;                                             <*zt*>
    <*-2*>
    \f

    message modiffil side 1 - 781120/jg;
    
    integer procedure modiffil(filref,postindex,zoneno);
    value filref,postindex;
    integer filref,postindex,zoneno;
    <*+2*>
    <*tz*> begin integer i,o,s;                                       <*zt*>
    <*tz*> i:=fillæst;o:=filskrevet; s:=                              <*zt*>
    <*-2*>
    
    modiffil:=tilgangfil(filref,postindex,zoneno,7);
    
    <*+2*>
    <*tz*> if testbit24 and overvåget then                            <*zt*>
    <*tz*>   begin                                                    <*zt*>
    <*tz*>     write(out,<:<10>modiffil::>,s,filref,postindex,zoneno, <*zt*>
    <*tz*>     <: io::>,fillæst-i,filskrevet-o);ud;                   <*zt*>
    <*tz*>   end;                                                     <*zt*>
    <*tz*> end procedure;                                             <*zt*>
    <*-2*>
    \f

    message tilgangfil side 1 - 781003/jg;
    
    integer procedure tilgangfil(filref,postindex,zoneno,operation);
    value filref,postindex,operation;
    integer filref,postindex,zoneno,operation;
    <*proceduren kaldes fra læsfil,skrivfil og modiffil*>
    
    begin
      integer ftype,fno,f,pl,pr,pps,seg,zno,zstate,katf,st;
      integer array zd(1:20),fdim(1:8);
    
    
    
                <*hent katalog*>
    
      fdim(4):=filref;
      st:=hentfildim(fdim);
      if st<>0 then
        goto udgang; <*parameter fejl eller fil findes ikke*>
      fno:=filref extract 10;
      ftype:=filref shift (-10);
      pl:=fdim(2);
      katf:=case ftype of(dbkatt(fno,2),dbkats(fno,2),dbkate(fno,2));
    \f

    message tilgangfil side 2 - 781003/jg;
    
    
    
                <*find segment adr og check postindex*>
    
      pps:=256//pl; <*poster pr segment*>
      seg:=(postindex-1)//pps; <*relativt segment*>
      pr:=(postindex-1) mod pps; <*post relativ til seg*>
      if postindex <1 then
        begin <*parameter fejl*>
          st:=1;
          goto udgang
        end;
      if seg>=fdim(3) then
        begin <*post findes ikke*>
          st:=3;
          goto udgang
        end;
      case ftype of
        begin <*find absolut segment*>
    
          <*tabelfil*>
          seg:=seg+(if fno=1 then dbblokt else dbkatt(fno-1,2) extract 18);
    
          begin <*spoolfil*>
            integer i,bidno;
            bidno:=katf extract 12;
            for i:=seg//dbbidlængde step -1 until 1 do
              bidno:=dbkatb(bidno) extract 12;
            seg:=(bidno-1)*dbbidlængde+seg mod dbbidlængde
          end;
    
          <*extern fil,seg ok*>
    
        end case find abs seg;
    \f

    message tilgangfil side 3 - 801030/jg;
    
                <*alloker zone*>
    
      zno:=katf shift(-19);
      case ftype of begin
    
        begin <*tabelfil*>
          integer førstetz;
          førstetz:=dbkatz(dbsidstetz,2);
          if zno=0 then
            zno:=førstetz
          else if dbkatz(zno,1)<>filref then
            zno:=førstetz
          else if zno <> førstetz and zno <> dbsidstetz then
            begin integer z;
              for z:=zno,dbkatz(z,2) while dbkatz(z,2)<>zno do;
              dbkatz(z,2):=dbkatz(zno,2);
              dbkatz(zno,2):=førstetz;
              dbkatz(dbsidstetz,2):=zno;
            end;
          dbsidstetz:=zno
        end;
    \f

    message tilgangfil side 4 - 801030/jg;
    
    
        begin <*spoolfil*>
          integer p,zslut,z;
          if zno>0 then begin if dbkatz(zno,1) =filref then
            goto udgangs end; <*strategi 1*>
          p:=0;
          zno:=dbsidstesz; <*strategi 4 hvis bedre ikke findes*>
          zslut:= <*if dbantez>dbantef then 1 else*> dbantez+1;
          for z:=dbantez+dbantsz step -1 until zslut do
          begin integer zfref;
            zfref:=dbkatz(z,1);
            if zfref extract 10=0 then <*fri zone*>
              begin <*strategi 2*>
                zno:=z;
                goto udgangs
              end
            else
              if zfref shift (-10)=2 then
                begin <*zone tilknyttet spoolfil*>
                  integer q;
                  q:=dbkatz(z,2); <*prioritet*>
                  if q>p then
                    begin <*strategi 3*>
                      p:=q;
                      zno:=z
                    end
                end;
          end z;
        udgangs:
          if zno> dbantez then dbsidstesz:=zno;
        end;
    \f

    message tilgangfil side 5 - 780916/jg;
    
        begin <*extern fil*>
          integer z;
          if zno=0 then
            zno:=1 
          else if dbkatz(zno,1) = filref then
                 goto udgange; <*strategi  1*>
          for z:=1 step 1 until dbantez do
          begin integer zfref;
            zfref:=dbkatz(z,1);
            if zfref=0 then <*zone fri*>
              begin zno:=z; goto udgange end <*strategi 2*>
            else if zfref shift (-10) =2 then <*spoolfil*>
                   zno:=z; <*strategi 3*>  <*else strategi 4-5*>
          end z;
        udgange:
        end
      end case alloker zone;
    
    
    
             <*åbn zone*>
    
      if zno<=dbantez then
        begin <*extern zone;spool og tabel zoner altid åbne*>
          integer zfref;
          zfref:=dbkatz(zno,1);
          if zfref<>0 and zfref<>filref and ftype=3 then
                begin <*luk hvis ny extern fil*>
                  getzone6(fil(zno),zd);
                  if zd(13)>5 then filskrevet:=filskrevet+1;
                  zfref:=0;
                  close(fil(zno),false); 
                end;
          if zfref=0 then
            begin <*åbn zone*>
              array field enavn; integer i;
              enavn:=4*2; i:=1;
              open(fil(zno),4,case ftype-1 of(string dbsnavn(increase(i)),
                string fdim.enavn(increase(i))),0)
            end
        end;
    \f

    message tilgangfil side 6 - 780916/jg;
    
    
    
                <*hent segment og sæt zone descriptor*>
    
      getzone6(fil(zno),zd);
      zstate:=zd(13);
      if zstate=0 or zd(9)<>seg then
        begin <*positioner*>
          if zstate>5 then
            filskrevet:=filskrevet+1;
          setposition(fil(zno),0,seg);
          if -,(operation=6 and pr=0) then
            begin <*læs seg medmindre op er skriv første post*>
              inrec6(fil(zno),512);
              fillæst:=fillæst+1
            end;
          zstate:=operation
        end
      else <*zstate:=max(operation,zone state)*>
        if operation>zstate then
          zstate:=operation;
      zd(9):=seg;
      zd(13):=zstate;
      zd(16):=pl shift 1;
      zd(14):=zd(19)+pr*zd(16);
      setzone6(fil(zno),zd);
    \f

    message tilgangfil side 7 - 780916/jg;
    
    
    
             <*opdater kataloger*>
    
      katf:=zno shift 19 add (katf extract 19);
      case ftype of
        begin
          dbkatt(fno,2):=katf;
          dbkats(fno,2):=katf;
          dbkate(fno,2):=katf
        end;
      dbkatz(zno,1):= filref;
     if ftype=3 then dbkatz(zno,2):=0 else
      <*if ftype=1 then allerede opd under zoneallokering*>
      if ftype=2 then dbkatz(zno,2):= <*prioritet spoolfil*>
        if zstate=5 then (if pr=pps-1 then 2 else 1)
        else if zstate=6 and pr=pps-1 then 3 else 0;
    
    
    
                <*udgang*>
    
    udgang:
      if st=0 then
        zoneno:=zno
      else zoneno:=0; <*fejl*>
      tilgangfil:=st;
    end tilgangfil;
    \f

    
    message pfilsystem side 1 - 781003/jg;
    
    procedure pfilparm(z);
      zone z;
    write(z,<:<10>dbantez=:>,dbantez,<: dbantsz=:>,dbantsz,<: dbanttz=:>,
      dbanttz,<:<10>dbmaxtf=:>,dbmaxtf,<: dbblokt=:>,dbblokt,<: dbmaxsf=:>,dbmaxsf,
      <:<10>dbmaxb=:>,dbmaxb,<:  dbbidlængde=:>,dbbidlængde,<:   dbbidmax=:>,
      dbbidmax,<:<10>dbmaxef=:>,dbmaxef);
    
    procedure pfilglobal(z);
      zone z;
    write(z,<:<10>dbantsf=:>,dbantsf,<: dbkatsfri=:>,dbkatsfri,
      <:<10>dbantb=:>,dbantb,<:  dbkatbfri=:>,dbkatbfri,
      <:<10>dbantef=:>,dbantef,<: dbkatefri=:>,dbkatefri,
      <:<10>dbsidstesz=:>,dbsidstesz,<: dbsidstetz=:>,dbsidstetz,
      <:<10>filskrevet=:>,filskrevet,<: fillæst=:>,fillæst,
      <:<10>dbsnavn=:>,dbsnavn,<: dbtnavn=:>,dbtnavn);
    
    
    procedure pdbkate(z,i);
    value i; integer i;
      zone z;
    begin integer j; array field navn;
      navn:=i*12+4; j:=1;
      write(z,<:<10>dbkate(:>,i,<:)=:>,
      dbkate(i,1) shift (-9),
      dbkate(i,1) extract 9,
      dbkate(i,2) shift (-19),
      dbkate(i,2) shift (-18) extract 1,
      dbkate(i,2) extract 18,
      <: :>,string dbkate.navn(increase(j)));
    end;
    \f

    message pfilsystem side 2 - 781003/jg;
    
    
    
    procedure pdbkats(z,i);
    value i; integer i;
      zone z;
    write(z,<:<10>dbkats(:>,i,<:)=:>,
      dbkats(i,1) shift (-9),
      dbkats(i,1) extract 9,
      dbkats(i,2) shift (-19),
      dbkats(i,2) shift (-18) extract 1,
      dbkats(i,2) shift (-12) extract 6,
      dbkats(i,2) extract 12);
    
    procedure pdbkatb(z,i);
    value i;integer i;
      zone z;
    write(z,<:<10>dbkatb(:>,i,<:)=:>,
      dbkatb(i) extract 12);
    
    procedure pdbkatt(z,i);
    value i; integer i;
      zone z;
    write(z,<:<10>dbkatt(:>,i,<:)=:>,
      dbkatt(i,1) shift (-9),
      dbkatt(i,1) extract 9,
      dbkatt(i,2) shift (-19),
      dbkatt(i,2) shift (-18) extract 1,
      dbkatt(i,2) extract 18);
    
    procedure pdbkatz(z,i);
    value i; integer i;
      zone z;
    write(z,<:<10>dbkatz(:>,i,<:)=:>,
      dbkatz(i,1),dbkatz(i,2));
    \f

    message pfilsystem side 3 - 781003/jg;
    
    
    
    procedure pfil(z,i);
    value i; integer i;
      zone z;
    begin integer j,k; array field navn; integer array zd(1:20);
      navn:=2; k:=1;
      getzone6(fil(i),zd);
      write(z,<:<10>fil(:>,i,<:)=:>,
      zd(1) shift (-12),<:+:>,zd(1) extract 12,<: :>,
      string zd.navn(increase(k)));
      for j:=6 step 1 until 10 do write(z,zd(j));
      write(z,<:<10>:>);
      for j:=11 step 1 until 20 do write(z,zd(j));
    end;
    
    procedure pfilsystem(z);
      zone z;
    begin integer i;
    
      write(z,<:<12>udskrift af variable i filsystem:>);
          write(z,<:<10><10>filparm::>);
          pfilparm(z);
          write(z,<:<10><10>filglobal::>);
          pfilglobal(z);
          write(z,<:<10><10>fil: zone descriptor:>);
      for i:=1 step 1 until dbantez+dbantsz+dbanttz do pfil(z,i);
      write(z,<:<10><10>dbkatz: filref ezdis/szprioritet/tzref:>);
          for i:=1 step 1 until dbantez+dbantsz+dbanttz do pdbkatz(z,i);
          write(z,<:<10><10>dbkate: pa pl zref dis stot/kateref enavn:>);
          for i :=1 step 1 until dbmaxef do pdbkate(z,i);
          write(z,<:<10><10>dbkats: pa pl zref dis bant bref/katsref:>);
          for i:=1 step 1 until dbmaxsf do pdbkats(z,i);
          write(z,<:<10><10>dbkatb: katbref:>);
          for i:=1 step 1 until dbmaxb do pdbkatb(z,i);
          write(z,<:<10><10>dbkatt: pa pl zref dis stot:>);
          for i:=1 step 1 until dbmaxtf do pdbkatt(z,i);
    end pfilsystem;
    \f

    message pfilsystem side 4 - 781003/jg;
    
    
    
    procedure pfdim(fdim);
    integer array fdim;
    begin
      integer i;
      array field navn;
      i:=1;navn:=8;
      write(out,<:fdim::>,fdim(1),fdim(2),fdim(3),fdim(4),<: :>,
      string fdim.navn(increase(i)));
    end pfdim;
    \f

    message opretfil side 0 - 810529/cl;
    
    procedure opretfil;
      <* checker parametre og vidresender operation
         til opret_spoolfil eller opret_eksternfil *>
    
    begin
      integer array field op;
      integer status,pant,pl,segant,p_nøgle,fno,ftype;
    
      procedure skriv_opret_fil(z,omfang);
        value                    omfang;
        zone                   z;
        integer                  omfang;
      begin
        write(z,"nl",1,<:+++ opret fil            :>);
        if omfang > 0 then
        disable
        begin
          skriv_coru(z,abs curr_coruno);
          write(z,"nl",1,<<d>,
            <:op     :>,op,"nl",1,
            <:status :>,status,"nl",1,
            <:pant   :>,pant,"nl",1,
            <:pl     :>,pl,"nl",1,
            <:segant :>,segant,"nl",1,
            <:p-nøgle:>,p_nøgle,"nl",1,
            <:fno    :>,fno,"nl",1,
            <:ftype  :>,ftype,"nl",1,
            <::>);
        end;
      end skriv_opret_fil;
    \f

    message opretfil side 1 - 810526/cl;
    
      trap(opretfil_trap);
    <*+2*>
    <**>  disable if testbit28 then
    <**>    skriv_opret_fil(out,0);
    <*-2*>
    
      stack_claim(if cm_test then 200 else 150);
    
    <*+2*>
    <**> if testbit28 then write(out,"nl",1,<:+++ opret fil            :>);
    <*-2*>
    
    trin1:
      waitch(cs_opret_fil,op,true,-1);
    
    trin2: <* check parametre *>
      disable begin
    
        ftype:= d.op.data(4) shift (-10);
        fno:= d.op.data(4) extract 10;
        if ftype<2 or ftype>3 or fno<>0 then
        begin
          status:= 1; <*parameterfejl*>
          goto returner;
        end;
    
        pant:= d.op.data(1);
        pl:= d.op.data(2);
        segant:= d.op.data(3);
        p_nøgle:= d.op.opkode shift (-12);
        if pant<0 or pl<1 or pl>256 or segant<(case ftype-1 of(1,0))
          or p_nøgle<>0 and p_nøgle<>2 and p_nøgle<>3 then
            status:= 1 <*parameterfejl *>
        else
        if pant>256//pl*segant then status:= 1 else
        if segant>(case ftype-1 of(dbbidmax*dbbidlængde,dbsegmax)) then
          status:= 4 <*ingen plads*>
        else
          status:=0;
    \f

    message opretfil side 2 - 810526/cl;
    
    
    returner:
    
        d.op.data(9):= status;
    
    <*+2*>
    <*tz*> if testbit24 and overvåget and status<>0 then    <*zt*>
    <*tz*> begin                                            <*zt*>
    <*tz*>   write(out,<:<10>opretfil::>,status,<: :>);     <*zt*>
    <*tz*>   pfdim(d.op.data);                              <*zt*>
    <*tz*>   write(out,<: op::>,op,d.op.retur); ud;         <*zt*>
    <*tz*> end;                                             <*zt*>
    <*-2*>
    
        <*returner eller vidresend operation*>
        signalch(if status>0 then d.op.retur else
          case ftype-1 of(cs_opret_spoolfil,cs_opret_eksternfil),
          op,d.op.optype);
      end;
      goto trin1;
    opretfil_trap:
      disable skriv_opret_fil(zbillede,1);
    
    end opretfil;
    \f

    message tilknytfil side 0 - 810526/cl;
    
    procedure tilknytfil;
      <* tilknytter ekstern fil og returnerer intern filid *>
    
    begin
      integer array field op;
      integer status,i,fno,segant,pa,pl,sliceant,s;
      array field enavn;
      integer array tail(1:10);
    
      procedure skriv_tilknyt_fil(z,omfang);
        value                       omfang;
        zone                      z;
        integer                     omfang;
      begin
        write(z,"nl",1,<:+++ tilknyt fil          :>);
        if omfang > 0 then
        disable
        begin real array field raf;
          skriv_coru(z,abs curr_coruno);
          write(z,"nl",1,<<d>,
            <:op      :>,op,"nl",1,
            <:status  :>,status,"nl",1,
            <:i       :>,i,"nl",1,
            <:fno     :>,fno,"nl",1,
            <:segant  :>,segant,"nl",1,
            <:pa      :>,pa,"nl",1,
            <:pl      :>,pl,"nl",1,
            <:sliceant:>,sliceant,"nl",1,
            <:s       :>,s,"nl",1,
            <::>);
          raf:= 0;
          write(z,<:tail::>); skriv_hele(z,tail.raf,20,128);
          write(z,<:ia::>); skriv_hele(z,ia.raf,20,128);
        end;
      end skriv_tilknyt_fil;
    \f

    message tilknytfil side 1 - 810529/cl;
    
      stack_claim(if cm_test then 200 else 150);
      trap(tilknytfil_trap);
    
    <*+2*>
    <**> if testbit28 then
    <**>   skriv_tilknyt_fil(out,0);
    <*-2*>
    
    trin1:
      waitch(cs_tilknyt_fil,op,true,-1);
    
    trin2:
      wait(bs_kate_fri);
    
    trin3:
      disable begin
    
        <* find ekstern rapportfil *>
        enavn:= 8;
        if find_fil_enavn(d.op.data.enavn)>0 then
        begin
          status:= 6; <* fil i brug *>
          goto returner;
        end;
        open(zdummy,0,d.op.data.enavn,0);
        s:= monitor(42)lookup entry:(zdummy,0,tail);
        if s<>0 then
        begin
          if s=3 then status:= 2 <* fil findes ikke *>
         else if s=6 then status:= 1 <* parameterfejl, navn *>
         else fejlreaktion(1,s,<:lookup entry:>,0);
          goto returner;
        end;
        if tail(9)<>d.op.data(4) <* contentskey,subno *> then
        begin
          status:= 5; <* forkert indhold *> goto returner;
        end;
        segant:= tail(1);
        if segant>db_seg_max then
          segant:= db_seg_max;
        pa:= tail(10);
        pl:= tail(7) extract 12;
        if pl < 1 or pl > 256 then
        begin status:= 7; goto returner; end;
    \f

    message tilknytfil side 2 - 810529/cl;
        if pa>256//pl*segant then
        begin status:= 7; goto returner; end;
    
        <* reserver *>
        s:= monitor(52)create area:(zdummy,0,ia);
        if s<>0 then
        begin
          if s=3 then status:= 2 <* fil findes ikke *>
          else if s=1 <* areaclaims exeeded *> then
          begin
            status:= 4;
            fejlreaktion(1,s,<:create area:>,1);
          end
          else fejlreaktion(1,s,<:create area:>,0);
          goto returner;
        end;
    
        s:= monitor(8)reserve:(zdummy,0,ia);
        if s<>0 then
        begin
          if s<3 then status:= 6 <* i brug *>
          else fejlreaktion(1,s,<:reserve:>,0);
          monitor(64)remove area:(zdummy,0,ia);
          goto returner;
        end;
    
        tail(7):= 1 shift 12 +pl; <* tilknyttet *>
        s:= monitor(44)change entry:(zdummy,0,tail);
        if s<>0 then fejlreaktion(1,s,<:change entry:>,0);
    
        <* opdater katalog *>
        dbantef:= dbantef+1;
        fno:= dbkatefri;
        dbkatefri:= dbkate(fno,2);
        dbkate(fno,1):= pa shift 9 add pl; <* postantal,postlængde *>
        dbkate(fno,2):= segant;
        for i:= 5 step 1 until 8 do
          dbkate(fno,i-2):= d.op.data(i);
    
        <* returparametre *>
        d.op.data(1):= pa;
        d.op.data(2):= pl;
        d.op.data(3):= segant;
        d.op.data(4):= 3 shift 10 +fno;
        status:= 0;
    \f

    message tilknytfil side 3 - 810526/cl;
    
    
    returner:
        close(zdummy,false);
        d.op.data(9):= status;
    
    
    <*+2*>
    <*tz*> if testbit24 and overvåget then                 <*zt*>
    <*tz*> begin                                           <*zt*>
    <*tz*>   write(out,<:<10>tilknytfil::>,status,<: :>);  <*zt*>
    <*tz*>   pfdim(d.op.data);                             <*zt*>
    <*tz*>   write(out,<: op::>,op,d.op.retur); ud;        <*zt*>
    <*tz*> end;                                            <*zt*>
    <*-2*>
    
        signalch(d.op.retur,op,d.op.optype);
        if dbantef < dbmaxef then
          signalbin(bs_kate_fri);
      end;
      goto trin1;
    tilknytfil_trap:
      disable skriv_tilknyt_fil(zbillede,1);
    end tilknyt_fil;
    \f

    message frigivfil side 0 - 810529/cl;
    
    procedure frigivfil;
      <* frigiver en tilknyttet ekstern fil *>
    
    begin
      integer array field op;
      integer status,fref,ftype,fno,s,i,z;
      array field enavn;
      integer array tail(1:10);
    
      procedure skriv_frigiv_fil(zud,omfang);
        value                        omfang;
        zone                     zud;
        integer                      omfang;
      begin
        write(zud,"nl",1,<:+++ frigiv fil           :>);
        if omfang > 0 then
        disable
        begin real array field raf;
          skriv_coru(zud,abs curr_coruno);
          write(zud,"nl",1,<<d>,
            <:op    :>,op,"nl",1,
            <:status:>,status,"nl",1,
            <:fref  :>,fref,"nl",1,
            <:ftype :>,ftype,"nl",1,
            <:fno   :>,fno,"nl",1,
            <:s     :>,s,"nl",1,
            <:i     :>,i,"nl",1,
            <:z     :>,z,"nl",1,
            <::>);
          raf:= 0;
          write(zud,<:tail::>); skriv_hele(zud,tail.raf,20,128);
        end;
      end skriv_frigiv_fil;
    \f

    message frigivfil side 1 - 810526/cl;
    
    
      stack_claim(if cm_test then 200 else 150);
      trap(frigivfil_trap);
    
    <*+2*>
    <**>  disable if testbit28 then
    <**>    skriv_frigiv_fil(out,0);
    <*-2*>
    
    trin1:
      waitch(cs_frigiv_fil,op,true,-1);
    
    trin2:
      disable begin
    
        <* find fil *>
        fref:= d.op.data(4);
        ftype:= fref shift (-10);
        fno:= fref extract 10;
        if ftype=0 or ftype>3 or fno=0 then
        begin status:= 1; goto returner; end;
        if fno>(case ftype of(dbmaxtf,dbmaxsf,dbmaxef)) then
        begin status:= 1; goto returner; end;
        if case ftype of(dbkatt(fno,1),dbkats(fno,1),dbkate(fno,1))
           extract 9 = 0 then
        begin
         status:= 2; <* fil findes ikke *>
         goto returner;
        end;
        if ftype <> 3 then
        begin status:= 5; goto returner; end;
    
        <* frigiv evt. tilknyttet zone og areaprocess *>
        z:= dbkate(fno,2) shift (-19);
        if z > 0 then
        begin
          if dbkatz(z,1)=fref then
          begin integer array zd(1:20);
            getzone6(fil(z),zd);
            if zd(13)>5 then filskrevet:= filskrevet +1;
            close(fil(z),true);
            dbkatz(z,1):= 0;
          end;
        end;
    \f

    message frigivfil side 2 - 810526/cl;
    
        <* opdater tail *>
        enavn:= fno*12+4;
        open(zdummy,0,dbkate.enavn,0);
        s:= monitor(42)lookup entry:(zdummy,0,tail);
        if s<>0 then fejlreaktion(1,s,<:lookup entry:>,0);
        tail(7):= dbkate(fno,1) extract 9; <* ej tilknyttet,postlængde *>
        tail(10):=dbkate(fno,1) shift (-9);<* postantal *>
        s:= monitor(44)change entry:(zdummy,0,tail);
        if s<>0 then fejlreaktion(1,s,<:change entry:>,0);
        monitor(64)remove process:(zdummy,0,tail);
        close(zdummy,true);
    
        <* frigiv indgang *>
        for i:= 1, 3 step 1 until 6 do
          dbkate(fno,1):= 0;
        dbkate(fno,2):= dbkatefri;
        dbkatefri:= fno;
        dbantef:= dbantef -1;
        signalbin(bs_kate_fri);
        d.op.data(4):= 0; <* filref null *>
        status:= 0;
    
    returner:
        d.op.data(9):= status;
    <*+2*>
    <*tz*> if testbit24 and overvåget then                  <*zt*>
    <*tz*> begin                                            <*zt*>
    <*tz*>   write(out,<:<10>frigivfil::>,status,<: :>);    <*zt*>
    <*tz*>   pfdim(d.op.data);                              <*zt*>
    <*tz*>   write(out,<: op::>,op,d.op.retur); ud;         <*zt*>
    <*tz*> end;                                             <*zt*>
    <*-2*>
    
        signalch(d.op.retur,op,d.op.optype);
      end;
      goto trin1;
    frigiv_fil_trap:
       disable skriv_frigiv_fil(zbillede,1);
    end frigivfil;
    \f

    message sletfil side 0 - 810526/cl;
    
    procedure sletfil;
      <* sletter en spool- eller ekstern fil *>
    
    begin
      integer array field op;
      integer fref,fno,ftype,status;
    
      procedure skriv_slet_fil(z,omfang);
        value                    omfang;
        zone                   z;
        integer                  omfang;
      begin
        write(z,"nl",1,<:+++ slet fil             :>);
        if omfang > 0 then
        disable
        begin
          skriv_coru(z,abs curr_coruno);
          write(z,"nl",1,<<d>,
            <:op    :>,op,"nl",1,
            <:fref  :>,fref,"nl",1,
            <:fno   :>,fno,"nl",1,
            <:ftype :>,ftype,"nl",1,
            <:status:>,status,"nl",1,
            <::>);
        end;
      end skriv_slet_fil;
    \f

    message sletfil side 1 - 810526/cl;
    
      stack_claim(if cm_test then 200 else 150);
    
      trap(sletfil_trap);
    <*+2*>
    <**>  disable if testbit28 then
    <**>    skriv_slet_fil(out,0);
    <*-2*>
    
    trin1:
      waitch(cs_slet_fil,op,true,-1);
    
    trin2:
      disable begin
    
        <* find fil *>
        fref:= d.op.data(4);
        ftype:= fref shift (-10);
        fno:= fref extract 10;
        if ftype=0 or ftype>3 or fno=0 then
        begin status:= 1; goto returner; end;
        if fno>(case ftype of(dbmaxtf,dbmaxsf,dbmaxef)) then
        begin status:= 1; goto returner; end;
        if case ftype of(dbkatt(fno,1),dbkats(fno,1),dbkate(fno,1))
          extract 9 = 0 then
        begin
          status:= 2; <* fil findes ikke *>
          goto returner;
        end;
    
    
        <* slet spool- eller ekstern fil *>
        case ftype of
        begin
    
          <* tabelfil - ingen aktion *>
          ;
    \f

    message sletfil side 2 - 810203/cl;
    
          <* spoolfil *>
          begin
            integer z,bidno,bf,bidant,i;
    
            <* hvis tilknyttet så frigiv *>
            z:= dbkats(fno,2) shift (-19);
            if z>0 then
            begin
              if dbkatz(z,1)=fref then
              begin integer array zd(1:20);
                dbkatz(z,1):= 2 shift 10;
                getzone6(fil(z),zd); <*annuler evt. udskrivning*>
                if zd(13)>5 then
                begin zd(13):= 0; setzone6(fil(z),zd); end;
              end;
            end;
    
            <* frigiv bidder *>
            bidno:= bf:= dbkats(fno,2) extract 12; <*bid start*>
            bidant:= dbkats(fno,2) shift (-12) extract 6;
            for i:= bidant -1 step -1 until 1 do
              bidno:= dbkatb(bidno) extract 12;
            dbkatb(bidno):= false add dbkatbfri;
            dbkatbfri:= bf;
            dbantb:= dbantb-bidant;
    
            <* frigiv indgang *>
            dbkats(fno,1):= 0;
            dbkats(fno,2):= dbkatsfri;
            dbkatsfri:= fno;
            dbantsf:= dbantsf -1;
            signalbin(bs_kats_fri);
          end spoolfil;
    \f

    message sletfil side 3 - 810203/cl;
    
          <* extern fil *>
          begin
            integer i,s,z;
            real array field enavn;
            integer array tail(1:10);
    
            <* find head and tail *>
            enavn:= fno*12+4;
            open(zdummy,0,dbkate.enavn,0);
            s:= monitor(42)lookup entry:(zdummy,0,tail);
            if s<>0 then fejlreaktion(1,s,<:lookup entry:>,0);
    
            <*frigiv evt. tilknyttet zone og areaprocess*>
            z:=dbkate(fno,2) shift (-19);
            if z>0 then
            begin
              if dbkatz(z,1)=fref then
              begin integer array zd(1:20);
                getzone6(fil(z),zd);
                if zd(13)>5 then <* udskrivning *>
                begin <*annuler*>
                  zd(13):= 0;
                  setzone6(fil(z),zd);
                end;
                close(fil(z),true);
                dbkatz(z,1):= 0;
              end;
            end;
    
            <* fjern entry *>
            s:= monitor(48)remove entry:(zdummy,0,tail);
            if s<>0 then fejlreaktion(1,s,<:remove entry:>,0);
            close(zdummy,true);
    
            <* frigiv indgang *>
            for i:=1, 3 step 1 until 6 do
              dbkate(fno,i):= 0;
            dbkate(fno,2):= dbkatefri;
            dbkatefri:= fno;
            dbantef:= dbantef -1;
            signalbin(bs_kate_fri);
          end eksternfil;
    
        end ftype;
    \f

    message sletfil side 4 - 810526/cl;
    
    
        status:= 0;
        if ftype > 1 then
          d.op.data(4):= 0; <*filref null*>
    
    returner:
        d.op.data(9):= status;
    
    <*+2*>
    <*tz*> if testbit24 and overvåget then                  <*zt*>
    <*tz*> begin                                            <*zt*>
    <*tz*>   write(out,<:<10>sletfil::>,status,<: :>);      <*zt*>
    <*tz*>   pfdim(d.op.data);                              <*zt*>
    <*tz*>   write(out,<: op::>,op,d.op.retur); ud;         <*zt*>
    <*tz*> end;                                             <*zt*>
    <*-2*>
        
         signalch(d.op.retur,op,d.op.optype);
      end;
      goto trin1;
    sletfil_trap:
        disable skriv_slet_fil(zbillede,1);
    end sletfil;
    \f

    message opretspoolfil side 0 - 810526/cl;
    
    procedure opretspoolfil;
      <* opretter en spoolfil og returnerer intern filid *>
    
    begin
      integer array field op;
      integer bidantal,fno,i,bs,bidstart;
    
      procedure skriv_opret_spoolfil(z,omfang);
        value                          omfang;
        zone                         z;
        integer                        omfang;
      begin
        write(z,"nl",1,<:+++ opret spoolfil       :>);
        if omfang > 0 then
        disable
        begin
          skriv_coru(z,abs curr_coruno);
          write(z,"nl",1,<<d>,
            <:op      :>,op,"nl",1,
            <:bidantal:>,bidantal,"nl",1,
            <:fno     :>,fno,"nl",1,
            <:i       :>,i,"nl",1,
            <:bs      :>,bs,"nl",1,
            <:bidstart:>,bidstart,"nl",1,
            <::>);
          end;
        end skriv_opret_spoolfil;
    \f

    message opretspoolfil side 1 - 810526/cl;
    
      stack_claim(if cm_test then 200 else 150);
    
      signalbin(bs_kats_fri); <*initialiseres til åben*>
    
      trap(opretspool_trap);
    <*+2*>
    <**>  disable if testbit28 then
    <**>    skriv_opret_spoolfil(out,0);
    <*-2*>
    trin1:
      waitch(cs_opret_spoolfil,op,true,-1);
    
    trin2:
      bidantal:= (d.op.data(3)<*segant*> - 1)//dbbidlængde +1;
      wait(bs_kats_fri);
    
    trin3:
      if bidantal>dbmaxb-dbantb then <*ikke plads,vent*>
      begin
        wait(bs_kats_fri);
        goto trin3;
      end;
      disable begin
    
        <*alloker bidder*>
        bs:= bidstart:= dbkatbfri;
        for i:= bidantal-1 step -1 until 1 do
          bs:= dbkatb(bs) extract 12;
        dbkatbfri:= dbkatb(bs) extract 12;
        dbkatb(bs):= false; <*sidste ref null*>
        dbantb:= dbantb+bidantal;
    
        <*alloker indgang*>
        fno:= dbkatsfri;
        dbkatsfri:= dbkats(fno,2);
        dbantsf:= dbantsf +1;
        dbkats(fno,1):= d.op.data(1) shift 9 <*postantal*> add
                        d.op.data(2) extract 9; <*postlængde*>
        dbkats(fno,2):= bidantal shift 12 add bidstart; <*zone null*>
    \f

    message opretspoolfil side 2 - 810526/cl;
    
        <*returner*>
        d.op.data(3):= bidantal*dbbidlængde; <*segantal*>
        d.op.data(4):= 2 shift 10 add fno; <*filref*>
        for i:= 5 step 1 until 8 do <*filnavn null*>
          d.op.data(i):= 0;
        d.op.data(9):= 0; <*status ok*>
    
    <*+2*>
    <*tz*> if testbit24 and overvåget then                  <*zt*>
    <*tz*> begin                                            <*zt*>
    <*tz*>   write(out,<:<10>opretfil::>,0,<: :>);          <*zt*>
    <*tz*>   pfdim(d.op.data);                              <*zt*>
    <*tz*>   write(out,<: op:>,op,d.op.retur); ud;          <*zt*>
    <*tz*> end;                                             <*zt*>
    <*-2*>
    
        signalch(d.op.retur,op,d.op.optype);
        if dbantsf<dbmaxsf then signalbin(bs_kats_fri);
      end;
      goto trin1;
    
    opretspool_trap:
        disable skriv_opret_spoolfil(zbillede,1);
    
    end opretspoolfil;
    \f

    message opreteksternfil side 0 - 810526/cl;
    
    procedure opreteksternfil;
      <* opretter og knytter en ekstern fil *>
    
    begin
      integer array field op;
      integer status,s,i,fno,p_nøgle;
      integer array tail(1:10),zd(1:20);
      real r;
      real array field enavn;
    
      procedure skriv_opret_ekstfil(z,omfang);
        value                         omfang;
        zone                        z;
        integer                       omfang;
      begin
        write(z,"nl",1,<:+++ opret ekstern fil    :>);
        if omfang > 0 then
        disable
        begin real array field raf;
          skriv_coru(z,abs curr_coruno);
          write(z,"nl",1,<<d>,
            <:op     :>,op,"nl",1,
            <:status :>,status,"nl",1,
            <:s      :>,s,"nl",1,
            <:i      :>,i,"nl",1,
            <:fno    :>,fno,"nl",1,
            <:p-nøgle:>,p_nøgle,"nl",1,
            <::>);
          raf:= 0;
          write(z,<:tail::>); skriv_hele(z,tail.raf,20,128);
          write(z,<:zd::>); skriv_hele(z,zd.raf,40,28);
        end;
      end skriv_opret_ekstfil;
    \f

    message opreteksternfil side 1 - 810526/cl;
    
      stack_claim(if cm_test then 200 else 150);
    
      signalbin(bs_kate_fri); <*initialiseres til åben*>
    
      trap(opretekst_trap);
    <*+2*>
    <**>  disable if testbit28 then
    <**>    skriv_opret_ekstfil(out,0);
    <*-2*>
    trin1:
      waitch(cs_opret_eksternfil,op,true,-1);
    
    trin2:
      wait(bs_kate_fri);
    
    trin3:
      <*opret temporær fil og tilknyt den*>
      disable begin
    
        enavn:= 8;
        <*opret*>
        open(zdummy,0,d.op.data.enavn,0);
        tail(1):= d.op.data(3); <*segant*>
        tail(2):= 1;
        tail(6):= systime(7,0,r); <*shortclock*>
        tail(7):= 1 shift 12 +d.op.data(2) extract 12; <*tilknyttet,postlgd*>
        tail(8):= 0;
        tail(9):= 31 shift 12; <*contentskey=ekstern fil,subnr=0*>
        tail(10):= d.op.data(1); <*postantal*>
        s:= monitor(40)create entry:(zdummy,0,tail);
        if s<>0 then
        begin
          if s=4 <*claims exeeded*> then
          begin
            status:= 4;
            fejlreaktion(1,s,<:create entry:>,1);
            goto returner;
          end;
          if s=3 <*navn ikke unikt*> then
          begin status:= 6; goto returner; end;
          fejlreaktion(1,s,<:create entry:>,0);
        end;
    \f

    message opreteksternfil side 2 - 810203/cl;
    
        p_nøgle:= d.op.opkode shift (-12);
        s:= monitor(50)permanent_entry:(zdummy,p_nøgle,tail);
        if s<>0 then
        begin
          if s=6 then
          begin <*claims exeeded*>
            status:= 4;
            fejlreaktion(1,s,<:permanent entry:>,1);
            monitor(48)remove entry:(zdummy,0,tail);
            goto returner;
          end
          else fejlreaktion(1,s,<:permanent entry:>,0);
        end;
    
        <*reserver*>
        s:= monitor(52)create areaprocess:(zdummy,0,zd);
        if s<>0 then
        begin
          fejlreaktion(1,s,<:create area:>,if s=1 then 1 else 0);
          status:= 4;
          monitor(48)remove entry:(zdummy,0,zd);
          goto returner;
        end;
    
        s:= monitor(8)reserve:(zdummy,0,zd);
        if s<>0 then fejlreaktion(1,s,<:reserve:>,0);
    
        <*tilknyt*>
        dbantef:= dbantef +1;
        fno:= dbkatefri;
        dbkatefri:= dbkate(fno,2);
        dbkate(fno,1):= tail(10) shift 9 add (tail(7) extract 12);
        dbkate(fno,2):= tail(1);
        getzone6(zdummy,zd);
        for i:= 2 step 1 until 5 do
          dbkate(fno,i+1):= d.op.data(3+i):= zd(i); <*navn*>
        d.op.data(3):= tail(1);
        d.op.data(4):= 3 shift 10 +fno;
        status:= 0;
    \f

    message opreteksternfil side 3 - 810526/cl;
    
    returner:
    
        close(zdummy,false);
        d.op.data(9):= status;
    
    <*+2*>
    <*tz*> if testbit24 and overvåget then                  <*zt*>
    <*tz*> begin                                            <*zt*>
    <*tz*>   write(out,<:<10>opretfil::>,status,<: :>);     <*zt*>
    <*tz*>   pfdim(d.op.data);                              <*zt*>
    <*tz*>   write(out,<: op::>,op,d.op.retur); ud;         <*zt*>
    <*tz*> end;                                             <*zt*>
    <*-2*>
    
        signalch(d.op.retur,op,d.op.optype);
        if dbantef<dbmaxef then signalbin(bs_kate_fri);
      end;
      goto trin1;
    
    opretekst_trap:
        disable skriv_opret_ekstfil(zbillede,1);
    
    end opreteksternfil;
    
    \f

    message attention_erklæringer side 1 - 850820/cl;
    
      integer
        tf_kommandotabel,
        cs_att_pulje,
        bs_fortsæt_adgang,
        att_proc_ref;
    
      integer array
        att_flag,
        att_signal(1:att_maske_lgd//2);
    
      integer array
       terminal_tab(1:terminal_beskr_længde//2*(1<*io*>+
                            max_antal_operatører+max_antal_garageterminaler)),
       fortsæt(1:32);
    \f

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

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

    message procedure param side 1 - 810226/cl;
    
    
    
    integer procedure param(txt,pos,spec,tabel_id,type,værdi,sep);
    value tabel_id;
    integer pos, tabel_id, type, sep;
    integer array txt, spec, værdi;
    
    
    
           <*************************************>
           <*                                   *>
           <*   CLAUS LARSEN:  15.07.77         *>
           <*                                   *>
           <*************************************>
    
    
    
    
    <*   param syntax-analyserer en parameterliste, og   *>
    <*   bestemmer næste parameter og den separator der  *>
    <*   afslutter parameteren                           *>
    
    
    
    begin
       integer array klasse(0:127), aktuel_param(1:4), fdim(1:8);
       real array indgang(1:2);
       integer i, j, tegn, tegn_pos, tal, hashnøgle,
          zone_nr, top, max_segm, start_segm, lpos;
       boolean  minus, separator;
       lpos := pos;
       type:=-1;
       for i:=1 step 1 until 4 do værdi(i):=0;
    \f

    message procedure param side 2 - 810428/cl,hko;
    
    
    
       <* grænsecheck for pos *>
       begin
          integer nedre, øvre;
    
          nedre := system(3,øvre,txt);
          nedre := nedre * 3 - 2;
          øvre  := øvre  * 3;
          if lpos < (nedre - 1) or øvre < lpos then
          begin
            sep:= -1;
            param:= 5;
            goto slut;
          end;
    
          <* er parameterlisten slut *>
          lpos:= lpos+1;
          læs_tegn(txt,lpos,tegn);
          if tegn = 'em' or tegn = 'nl' or tegn = 'nul' then
          begin
             lpos := lpos - 2;
             sep := tegn;
             param := 5;
    
             goto slut;
          end else lpos:= lpos-1;
       end;
    \f

    message procedure param side 3 - 810428/cl;
    
    
       <* initialisering *>
       for i := 1 step 1 until 4 do
          aktuel_param(i) := 0;
       minus := separator := false;
    
       <* initialiser klassetabel *>
       for i := 65 step 1 until 93,
                97 step 1 until 125 do klasse(i) := 1;
       for i := 48 step 1 until 57 do klasse(i) := 2;
       for i := 0 step 1 until 47, 58 step 1 until 64, 
                94, 95, 96, 126, 127 do klasse(i) := 4;
    
    
       <* sæt specialtegn *>
       i := 1;
       læs_tegn(spec,i,tegn);
       while tegn <> 0 do
       begin
          if klasse(tegn) = 4 and tegn <> 'sp' and tegn <> 'nl' then
             klasse(tegn) := 3;
          læs_tegn(spec,i,tegn);
       end;
    \f

    message procedure param side 4 - 810226/cl;
    
    
       <* læs første tegn i ny parameter og bestem typen *>
       læs_tegn(txt,lpos,tegn);
    
       case klasse(tegn) of 
       begin
    
          <* case 1 - bogstav *>
          begin
             type := 0;
             param := 0;
             tegn_pos := 1;
             hashnøgle := 0;
    
             <* læs parameter *>
             while tegn_pos < 12 and klasse(tegn) <> 4 do
             begin
                hashnøgle := hashnøgle + tegn;
                skriv_tegn(aktuel_param,tegn_pos,tegn);
                læs_tegn(txt,lpos,tegn);
             end;
    
             <* find separator *>
             while klasse(tegn) <> 4 do læs_tegn(txt,lpos,tegn);
             sep := tegn;
    \f

    message procedure param side 5 - 810226/cl;
    
             <* tabelopslag *>
             if tabel_id <> 0 then
             begin
                <* hent max_segm *>
    
                fdim(4) := tabel_id;
                j := hent_fil_dim(fdim);
                if j > 0 then
                begin
                   param := 4;
                   for i := 1 step 1 until 4 do 
                      værdi(i) := aktuel_param(i);
                   goto slut;
                end;
                max_segm := fdim(3);
    
                <* forbered opslag *>
                start_segm := (hashnøgle mod max_segm) + 1;
                indgang(1) := 0.0 shift 48 add aktuel_param(1)
                   shift 24 add aktuel_param(2);
                indgang(2) := 0.0 shift 48 add aktuel_param(3)
                   shift 24 add aktuel_param(4);
                hashnøgle := start_segm;
    \f

    message procedure param side 6 - 810226/cl;
    
                <* søg navn *>
                repeat
                   <* læs segment *>
                   læs_fil(tabel_id,hashnøgle,zone_nr);
    
                   <* beregn sidste element *>
                   top := fil(zone_nr,1) extract 24;
                   top := (top - 1) * 4 + 2;
    
                   <* søg *>
                   for i := 2 step 4 until top do
                      if fil(zone_nr,i) = indgang(1) and
                         fil(zone_nr,i+1) = indgang(2) then
                      begin
                         <* fundet *>
                         værdi(1) := fil(zone_nr,i+2) shift (-24)
                                       extract 24;
                         værdi(2) := fil(zone_nr,i+2) extract 24;
                         værdi(3) := fil(zone_nr,i+3) shift (-24)
                                     extract 24;
                         værdi(4) := fil(zone_nr,i+3) extract 24;
                         goto fundet;
                      end;
    
                   if top = 122 then <*overløb *>
                      hashnøgle := (hashnøgle mod max_segm) + 1;
                until top < 122 or hashnøgle = start_segm;
    
                <* navn findes ikke *>
                param := 2;
                for j := 1 step 1 until 4 do
                   værdi(j) := aktuel_param(j);
    fundet: ;
             end <*tabel_id <> 0 *>
             else
                for i := 1 step 1 until 4 do
                   værdi(i) := aktuel_param(i);
          end <* case 1 *>;
    \f

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

    message procedure param side 8 - 810428/cl;
    
          <* case 3 - specialtegn *>
    spc:  begin
             if tegn = '-' then
             begin
                læs_tegn(txt,lpos,tegn);
                if klasse(tegn) = 2 then
                begin
                   minus := true;
                   goto cif;
                end
                else
                begin
                   tegn := '-';
                   lpos := lpos - 1;
                end;
             end;
             <* syntaxfejl *>
             param := if separator then 1 else 3;
             sep := tegn;
          end <* case 3 *>;
    
          <* case 4 - separator *>
          begin
             separator := true;
             goto spc;
          end <* case 4 *>;
    
       end <* case *>;
    
       lpos := lpos - 1;
    slut: 
       pos := lpos;
    end;
    \f

    message procedure læs_param_sæt side 1 - 830310/cl;
    
    integer procedure læs_param_sæt(tekst,pos,ant,parm,term,res);
      integer array             tekst,        parm;
      integer                         pos,ant,     term,res;
    
    <* proceduren læser et sammenhørende sæt parametre
       afsluttet med (sp),(nl),(;),(,) eller (nul)
    
       læs_param_sæt      returstatus eller 'typen' af det læste parametersæt
       (retur,int)
                         type ant  parm indeholder:
                         <0:   x  (ingenting) 'læs_param_sæt= nr på fejlkvit.'
                          0:   0  (ingenting) 'rest kommando er tom'
                          1:   1  (tekst)  'indtil 11 tegn'
                          2:   1  (pos.tal)
                          3:   1  (neg.tal)
                          4:   1  (pos.tal<1000)(bogstav) 'linienummer'
                          5:   1  G(pos.tal<100) 'gruppe_ident'
                          6:   2  (linie)/(løb) 'vogn_ident'
                          7:   3  (bus)/(linie)/(løb)
                          8:   3  (linie).(indeks):(løb)
                          9:   2  (linie).(indeks)
                         10:   2  (pos.tal).(pos.tal)
                         11: 2-3  G(pos.tal<100):(vogn) '(vogn)::=(bus)!(linie)/(løb)'
                         12:   3  D.(dato).(tid)
    
       tekst             indeholder teksten hvori parametersættet
       (kald,int.arr.)   skal søges.
    
       pos
       (kald/retur,int.)  position efter hvilken søgningen starter, og
                          ved retur positionen for afsluttende tegn.
                            (ikke ændret ved fejl)
    
       ant               hvis kaldeværdien er >0 skal parametersættet
       (kald/retur,int)  indeholde det angivne antal enkeltparametre,
                         i modsat fald returneres med fejltype -26
                         (skilletegn) eller -25 (parameter mangler).
                         ellers læses op til 3 enkeltparametre. retur-
                         værdien afhænger af det læste parametersæts 
                         type, se ovenfor under læs_param_sæt.
    \f

    message procedure læs_param_sæt side 2 - 810428/hko;
    
       parm              skal omfatte elementerne 1 til 4.
       (retur,int.arr.)  ved returstatus<=0 indeholder alle elemen-
                         terne værdien 0.
    
                         type (element,indhold)
                           1: 1-4,teksten
                         2-3: 1, talværdien
                           4: 1, tal shift 5 +tegnværdi (A=1,B=2,--,Å=29)
                           5: 1, talværdi (uden G)
                           6: 1, (som'4') shift 7 + løb
                           7: 1, bus
                              2, linie/løb som '6'
                           8: 1, tal shift 5 eller som '4'
                              2, tekst (1-3 bogstaver)
                              3, løb
                           9: 1 og 2, som '8'
                          10: 1, talværdi
                              2, talværdi
                          11: 1, som '5'
                              2, vogn (bus eller linie/løb)
                          12: 1, dato
                              2, tid
    
       term              iso-tegnværdien for tegnet der afslutter
       (retur,int)       parameter_sættet.
    
       res               som læs_param_sæt.
       (retur,int)
    
    *>
    \f

    message procedure læs_param_sæt side 3 - 810310/hko;
    
      begin
        integer max_ant;
    
        max_ant:= 3;
    
        begin
          integer
            i,j,k,              <* hjælpe variable *>
            nr,                 <* nummer på parameter i sættet *>
            apos,               <* aktuel tegnposition *>
            cifre,             <* parametertype (param: 0=tekst, >1=tal) *>
            sep;                <* afsluttende skilletegn ved param *>
    
          integer array field
            iaf;                <* hjælpe variabel *>
    
          integer array
            par(1:4*max_ant),   <* 4 elementer for hver aktuel parameter *>
            s,                  <* 1 element med separator for hver parameter *>
            t(1:max_ant),       <* 1 element med typen for hver parameter *>
            værdi(1:4),         <* værdi af aktuel parameter jvf. param *>
            spec(1:1);          <* specialtegn i navne jvf. param *>
    
    <*          de interne typer af enkeltparametre er
    
                type  parameter
    
                  1:  1-3 tegn tekst (1 ord)
                  2:  4-6 tegn       (2 ord)
                  3:  7-9 tegn       (3 ord)
                  4:10-11 tegn       (4 ord)
                  5:  positivt heltal
                  6:  negativt heltal
                  7:  positivt heltal<1000 efterfulgt af stort bogstav
                  8:  G efterfulgt af positivt heltal<100
    
    *>
    \f

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

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

    message procedure læs_param_sæt side 6 - 810508/hko;
    
          if ant>nr then res:= -25 <*parameter mangler*>
          else
          if nr=0 or t(1)=0 then
          begin  <* ingen parameter før skilletegn *>
            if res=-25 then res:= 0;
          end
          else if sep<>'sp' and sep<>'nl' and sep <> 'em'
                  and sep<>';' and sep<>',' then
          begin <* ulovligt afsluttende skilletegn *>
            res:= -26;
          end
          else
          begin <* en eller flere lovligt afsluttede parametre *>
            if t(1)<5 and nr=1 then
    
    <* 1 navne_parameter *>
    
            begin
              res:= 1;
              tofrom(parm,par,8);
            end
            else if <*t(1)<9 and *> nr=1 then
    
    <* 1 parameter af anden type *>
    
            begin <*tal,linie eller gruppe *>
              res:= t(1) -3;
              parm(1):= par(1);
            end
            else if t(1)=5 <* pos.tal *> or t(1)=7 <*linie*> then
    
    <* mere end 1 parameter, hvoraf 1. er pos.tal eller linienr *>
    
            begin
              i:= par(1); <* lovlige parametre er alle repræsenteret i et ord *>
              j:= par(5); <* internt                                          *>
              k:= par(9); <*                                                  *>
              if nr=2 then
              <* 2 parametre i sættet *>
              begin
                res:= if (s(1)='/' or s(1)='.') and t(2)=5 <*pos.tal*> then 6
                      else if s(1)='.' and t(2)=1 then 9
                      else if s(1)='-' and t(1)=5 and t(2)=5 then 10
                      else if s(1)<>'/' and s(1)<>'.'
                                        and s(1)<>'-' then -26 <* skilletegn *>
                      else -27;<* parametertype*>
    \f

    message procedure læs_param_sæt side 7 - 810501/hko;
    
    <* mere end 1 parameter, hvoraf 1. er pos.tal eller linienr *>
    
                <* 2 parametre i sættet *>
                if res=6 then
                begin
                  if (i<1 or i>999) and t(1)=5 then
                    res:= -5 <* ulovligt linienr *>
                  else if (j<1 or j>99) then
                    res:= -6 <* ulovligt løbsnr *>
                  else
                  begin
                    if t(1)=5 then i:= i shift 5;
                    parm(1):= i shift 7 +j;
                  end;
                end <* res=6 *>
                else if res=9 then
                begin
                  if t(1)=5 and (i<1 or 999<i) then
                    res:= -5 <*ulovligt linienr*>
                  else
                  begin
                    if t(1)=5 then i:=i shift 5;
                    parm(1):= i;
                    parm(2):= j;
                  end;
                end <* res=9 *>
                else if res=10 then
                begin
                  begin
                    parm(1):= i;
                    parm(2):= j;
                  end;
                end; <* res=10 *>
              end <* nr=2 *>
              else
              if nr=3 then
              <* 3 paramtre i sættet *>
              begin
                res:= if (s(1)='/' or s(1)='.') and
                         (s(2)='/' or s(2)='.') then 7
                      else if s(1)='.' and s(2)=':' then 8
                      else -26; <* skilletegn *>
    \f

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

    message procedure læs_param_sæt side 9 - 810428/hko;
    
            end <* mere end 1 parameter,hvoraf 1. er pos.tal eller linienr *>
            else if t(1)=8 <* gruppe_id *> then
            begin
    <* mere end 1 parameter , hvoraf den første
       er en gruppe_identifikation ved navn.
       lovlige parametre er alle internt repræsenteret i et ord *>
    
              i:=par(1);
              j:=par(5);
              k:=par(9);
    
              if nr=2 then
              <* 2 parametre *>
              begin
                res:=if s(1)=':' and t(2)=5 then 11
                     else if s(1)<>':' then -26 <* skilletegn *>
                     else -27; <*param.type *>
                if res=11 then
                begin
                  if j<1 or j>9999 then res:=-7 <* ulovligt busnr *>
                  else
                  begin
                    parm(1):=i;
                    parm(2):=j;
                  end;
                end;
    \f

    message procedure læs_param_sæt side 10 - 810428/hko;
    
    <* mere end 1 parameter, hvoraf 1. er en gruppeidentifikation ved navn *>
    
              end <*nr=2*>
              else if nr=3 then
              <* 3 parametre *>
              begin
                res:=if s(1)=':' and s(2)='/' then 11
                     else -26; <* skilletegn *>
                if res=11 then
                begin
                  if (t(2)<>5 and t(2)<>7) or t(3)<>5 then res:=-27 <*param.type*>
                  else
                  begin
                    if t(2)=5 and (j<1 or j>999) then res:=-5 <* linie *>
                    else
                    begin
                      parm(1):=i;
                      if t(2)=5 then j:=j shift 5;
                      parm(2):= 1 shift 22 +j shift 7 +k;
                    end;
                  end;
                end;
              end <* nr=3 *>
              else res:=-24; <* syntaks *>
    \f

    message procedure læs_param_sæt side 11 - 810501/hko;
    
            end <* t(1)=8 *>
            else if t(1)=1 and par(1)= 'D' shift 16 then
            begin
    <* mere end 1 parameter i sættet og 1. parameter er et 'D'.
                 lovlige parametre er alle internt repræsenteret i et ord. *>
              i:=par(1);
              j:=par(5);
              k:=par(9);
    
              if nr=3 then
              begin
                res:=if s(1)='.' and s(2)='.' then 12
                     else -26; <* skilletegn *>
                if res=12 then
                begin
                  if t(2)<>5 or t(3)<>5 then res:=-27 <* param. type *>
                  else
                  begin
                    integer år,md,dg,tt,mm,ss;
                    real dato,tid;
                    år:=j//10000;
                    md:=(j//100) mod 100;
                    dg:=j mod 100;
                    cifre:= par(10);
                    tt:=if cifre>4 then k//10000 else if cifre>2 then k//100
                           else k;
                    mm:=if cifre>4 then (k//100) mod 100
                           else if cifre>2 then k mod 100 else 0;
                    ss:=if cifre>4 then k mod 100 else 0;
    \f

    message procedure læs_param_sæt side 12 - 810501/hko;
    
                    dato:=systime(5,0.0,tid);
                    if j=0 then dg:=round dato mod 100;
                    if år=0 and md=0 then md:=(round dato//100) mod 100;
                    if år=0 then år:=round dato//10000;
                    if år>99 or md<1 or md>12 or tt>23 or mm>59 or ss>59 then
                      res:=-24 <* syntaks *>
                    else if dg<1 or dg > (case md of (
                           31,(if år mod 4=0 then 29 else 28),31, 30,31,30,
                           31,31,30, 31,30,31)) then res:=-24
                    else
                    begin
                      parm(1):=år*10000+md*100+dg;
                      parm(2):=tt*10000+mm*100+ss;
                    end;
                  end;
    
                end; <* res=12 *>
              end <* nr=3 *>
              else res:=-24; <*syntaks*>
            end <* t(1)=1 and par(1)='D' shift 16 *>
    
            else res:=-27;<*parametertype*>
          end; <* en eller flere parametre *>
    
          læs_param_sæt:= res;
          term:= sep;
          if res>= 0 then pos:= apos;
        end;
      end læs_param_sæt;
    \f

    message procedure læs_kommando side 1 - 810428/hko;
    
    integer procedure læs_kommando(z,kilde,op_ref,pos,indeks,sep,slut_tegn);
      value                           kilde;
      zone                          z;
      integer                         kilde,       pos,indeks,sep,slut_tegn;
      integer array field                   op_ref;
    
    <* proceduren indlæser er kommmando fra en terminal (telex,
       skærm eller skrivemaskine). ved indlæsning fra skærm eller
       skrivemaskine inviteres først ved udskrivning af '>'-tegn.
       for terminalers vedkommendeslettes linie 23 og 24 og 'cursor' positioneres til
       23'ende linie inden invitation.
    *>
    \f

    message procedure læs_kommando side 2 - 810428/hko;
    
    begin
      integer
        a_pos,
        a_res,res,
        i,j,k;
      boolean
        skip;
    
    <*V*>setposition(z,0,0);
    
      case kilde//100 of
      begin
        begin <* io *>
          write(z,"nl",1,">",1);
        end;
    
        begin <* operatør *>
          cursor(z,24,1);
          write(z,"esc" add 128,1,<:ÆK:>);
          cursor(z,23,1);
          write(z,"esc" add 128,1,<:ÆK:>);
          outchar(z,'>');
        end;
    
        begin <* garageterminal *> ;
          outchar(z,'nl');
        end
      end;
    
    <*V*>setposition(z,0,0);
    \f

    message procedure læs_kommando side 3 - 810921/hko,cl;
    
        res:=0;
        skip:= false;
    <*V*>
        k:=læs_store(z,i);
    
        apos:= 1;
        while k<=6 <*klasse=bogstav*> do
        begin
          if a_pos<3 then skriv_tegn(d.op_ref.data,apos,i);
    <*V*> k:= læs_store(z,i);
        end;
    
        skip:= skip or i='?' or (a_pos=1 and (i=',' or i=';'));
    
        if i=',' and a_pos>1 then
        begin
          skrivtegn(d.op_ref.data,a_pos,i);
          repeat
      <*V*> k:= læs_store(z,i);
            if a_pos=4 and k=6 then skriv_tegn(d.op_ref.data,a_pos,i);
          until k>=7;
        end;
    
        pos:=a_pos;
        while k<8 do
        begin
          if a_pos< (att_op_længde//2*3-2) then
            skriv_tegn(d.op_ref.data,a_pos,i);
          skip:= skip or i='?';
    <*V*> k:= læs_store(z,i);
          pos:=pos+1;
        end;
    
        skip:= skip or i='?' or i='esc';
        slut_tegn:= i;
        skrivtegn(d.op_ref.data,apos,'em');
        afslut_text(d.op_ref.data,apos);
    \f

    message procedure læs_kommando side 4 - 820301/hko/cl;
    
      disable
      begin
        integer
          i1,
          nr,
          partype,
          cifre;
        integer array
          spec(1:1),
          værdi(1:4);
    
    <*+2*>
        if testbit25 and overvåget then
        disable begin
          real array field raf;
          write(out,"nl",1,<:kommando læst::>);
          laf:=data;
          write(out,d.op_ref.laf,<:<'<'>sluttegn<'>'>=:>,<<d>,sluttegn,
                    <: skip=:>,if skip then <:true:> else <:false:>);
          ud;
        end;
    <*-2*>
    
        for i:=1 step 1 until 32 do ia(i):=0;
    
        if skip then
        begin
          res:=53; <*annulleret*>
          pos:= -1;
          goto slut_læskommando;
        end;
    \f

    message procedure læs_kommando side 5 - 850820/cl;
    
        i:= kilde//100; <* hovedmodul *>
        k:= kilde mod 100; <* løbenr *>
    <*  if pos>79 then linieoverløb; *>
        pos:=a_pos:=0;
        spec(1):= ',' shift 16;
    
    <*+4*>
        if k<1 or k>(case i of (1,max_antal_operatører,
                                  max_antal_garageterminaler)) then
        begin
          fejlreaktion(3<*programfejl*>,kilde,<:ukendt kilde til kommando:>,1);
          res:=31;
        end
        else
    <*-4*>
        if i>0 and i<4 then <* io, operatør eller garageterminal *>
        begin
          <* læs operationskode *>
          j:=param(d.op_ref.data,apos,spec,tf_kommandotabel,cifre,værdi,sep);
    
          res:= if j=1 and sep='.' and i=2<*operatør*> then -1 <* skærmopdatering *>
                else if cifre>0 or j=1 or j=3 or j=5 then  24 <* syntaks *>
                else if j=2 then 4 <*ukendt kommando*>
                else if j=4 then 31 <*systemfejl: ukendt tabelfil*>
                else if sep<>'sp' and sep<>','
                        and sep<>'nl' and sep<>';'
                        and sep<>'nul' and sep<>'em' then 26
                                                           <*skilletegn*>
                else if -, læsbit_i(værdi(4),i-1) then 4 
    <*                  logand(extend 0 add værdi(4)
                               extend 1 shift (case i of (0,k,8+k)))=0 then 4
    *>                                                   <*ukendt kommando*>
                else 1;
    \f

    message procedure læs_kommando side 5a- 810409/hko;
    
    <*+2*>if testbit25 and overvåget then
          begin
            write(out,"nl",0,<:funk opslag: param,apos,cifre,sep,res::>,
                  << -dddd>,j,apos,cifre,sep,res,
                  <:   værdi(1-4)::>,værdi(1),værdi(2),værdi(3),værdi(4),
                  "nl",0);
            if j<>0 then skriv_op(out,op_ref);
            ud;
          end;
    <*-2*>
    
          if res=31 then fejlreaktion(18<*tabelfil*>,j,
                                      <:=res, filnr 1025, læskommando:>,0);
    
          if res=1 then <* operationskode ok *>
          begin
            if sep<>'sp' then apos:=apos-1;
            d.op_ref.opkode:=værdi(1);
            indeks:=værdi(2);
            partype:= værdi(3);
            nr:= 0;
            pos:= apos;
    \f

    message procedure læs_kommando side 6 - 810409/hko;
    
            while res=1 do
            begin
              læs_param_sæt(d.op_ref.data,apos,0<*indtil 3 enkeltparametre*>,
                            værdi,sep,a_res);
              nr:= nr +1;
              i1:= værdi(1);
    <*+2*>  if testbit25 and overvåget then
            begin
              write(out,"nl",1,<:param sæt: apos,sep,ares::>,<< -dddddd>,
                    apos,sep,ares,<:   værdi(1-4)::>,
                    værdi(1),værdi(2),værdi(3),værdi(4),
                    "nl",0);
              ud;
           end;
    <*-2*>
              case par_type of
              begin
    
    <*1: (<ingenting>!<busnr> (<omr>)!<linienr>/<løbnr> (<omr>)) *>
    
                begin
                  if nr=1 then
                  begin
                    if a_res=0 then res:=2 <*godkendt*>
                    else if a_res=2 and (i1<1 or i1>9999)
                         then res:=7 <*busnr ulovligt*>
                    else if a_res=2 or a_res=6 then
                    begin
                      ia(1):= if a_res=2 then i1
                                         else 1 shift 22 +i1;
                    end
                    else res:= 27; <*parametertype*>
                    if res<4 then pos:= apos;
                  end <*nr=1*>
                  else
                  if nr=2 then
                  begin
                    if ares=0 then res:= 2 <*godkendt*>
                    else if ares=1 then
                    begin
                      ia(2):= find_område(i1);
                      if ia(2)=0 then res:= 17; <* kanal-nr ukendt *>
                    end
                    else res:= 27; <* syntaks, parametertype *>
                  end
                  else
                  if ares=0 then res:= 2<*godkendt*> else res:= 24 <* syntaks *>;
                end;
    \f

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

    message procedure læs_kommando side 8 - 810223/hko;
    
    <*3: (<linie>!G<nr>) *>
    
                begin
                  if nr=1 then
                  begin
                    if a_res=0 then res:=25 <*parameter mangler*>
                    else if a_res=2 and (i1<1 or i1>999) then res:=5
                                                        <*linienr ulovligt*>
                    else if a_res=2 or a_res=4 or a_res=5 then
                    begin
                      ia(1):=
                        if a_res=2 then      4 shift 21 +i1 shift 5
                        else if a_res=4 then 4 shift 21 +i1
                        else <* a_res=5 *>   5 shift 21 +i1;
                    end
                    else res:=27; <* parametertype *>
                    if res<4 then pos:= a_pos;
                  end
                  else
                  res:= if nr=2 and a_res<>0 then 24<*syntaks*>
                                             else 2;<*godkendt*>
                end;
    
    <*4:  <ingenting> *>
    
                begin
                  res:= if a_res<>0 then 24<*syntaks*>
                                    else 2;<*godkendt*>
                end;
    \f

    message procedure læs_kommando side 9 - 810226/hko;
    
    <*5: (<kanalnr>) *>
    
                begin
                  long field lf;
    
                  if nr=1 then
                  begin
                    if a_res=0 then res:= 25
                    else if a_res<>1 then res:=27<*parametertype*>
                    else
                    begin
                      j:= 0; lf:= 4;
                      for i:= 1 step 1 until max_antal_kanaler do
                        if kanal_navn(i)=værdi.lf then j:= i;
                      if j<>0 then
                      begin
                        ia(1):= 3 shift 22 + j;
                        res:= 2;
                      end
                      else
                        res:= 17; <* kanal ukendt *>
                    end;
                    if res<4 then pos:= a_pos;
                  end
                  else
                  res:=if nr=2 and a_res<>0 then 24<*syntaks*>
                                            else 2;<*godkendt*>
                end;
    \f

    message procedure læs_kommando side 10 - 810415/hko;
    
    <*6:  <busnr>/<linie>/<løb> (<område>) *>
    
                begin
                  if nr=1 then
                  begin
                    if a_res=0 then res:=25<*parameter mangler*>
                    else if a_res=7 then
                    begin
                      ia(1):= i1;
                      ia(2):= 1 shift 22 + værdi(2);
                    end
                    else res:=27;<*parametertype*>
                    if res<4 then pos:= apos;
                  end
                  else
                  if nr=2 then
                  begin
                    if ares=0 then res:= 2 <*godkendt*> else
                    if ares=1 then
                    begin
                      ia(3):= findområde(i1);
                      if ia(3)=0 then res:= 56; <* område ukendt *>
                    end
                    else res:= 27; <*parametertype*>
                    if res<4 then pos:= apos;
                  end
                  else
                  if ares=0 then res:= 2 else res:= 24;
                end;
    \f

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

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

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

    message procedure læs_kommando side 14 - 810428/hko;
    
    <*         2 *>
    <*10: (bus)  *>
    <*         1 *>
    
                begin
                  if a_res=0 and nr=1 then res:=25 <* parameter mangler *>
                  else if a_res<>0 and nr>2 then res:=24 <* syntaks (for mange) *>
                  else if a_res=0 then res:=2 <* godkendt *>
                  else if a_res<>2 then res:=27 <* parametertype *>
                  else if i1<1 or i1>9999 then res:=7 <*ulovligt busnr *>
                  else
                    ia(nr):=i1;
                end;
    
    <*             5 *>
    <*11: (<linie>)  *>
    <*             1 *>
    
                begin
                  if a_res=0 and nr=1 then res:=25
                  else if a_res<>0 and nr>5 then res:=24
                  else if a_res=0 then res:=2
                  else if a_res<>2 and a_res<>4 then res:=27
                  else if a_res=2 and (i1<1 or i1>999) then res:=5 <* ulovl.linie *>
                  else
                    ia(nr):=
                      (if a_res=4 then i1 else i1 shift 5) + 4 shift 21;
                end;
    \f

    message procedure læs_kommando side 15 - 810306/hko;
    
    <*12: (<ingenting>!<navn>) *>
    
                begin
                  if nr=1 then
                  begin
                    if a_res=0 then res:=2 <*godkendt*>
                    else if a_res=1 then
                      tofrom(ia,værdi,8)
                    else res:=27; <* parametertype *>
                  end
                  else
                    res:=if a_res<>0 then 24 <* syntaks (for mange) *>
                                     else  2;
                end; <* partype 12 *>
    \f

    message procedure læs_kommando side 16 - 810512/hko/cl;
    
    <*                                                         15 *>
    <*13: G<grp.nr>:(<bus>!<linie>/<løb>) (<bus>!<linie>/<løb>)   *>
    <*                                                         1  *>
    
                begin
                  if nr=1 then
                  begin
                    if a_res=0 then res:=25 <* parameter mangler *>
                    else
                    if a_res=11 then
                    begin
                      ia(1):= 5 shift 21 + i1;
                      ia(2):=værdi(2);
                      indeks:= 2;
                    end
                    else res:=27; <* parametertype *>
                  end
                  else if nr<= att_op_længde//2-1 then
                  begin
                    if a_res=0 and(sep=',' or nr>2)then res:=2 <* godkendt *>
                    else if a_res=0 then res:=25 <* parameter mangler *>
                    else if ares=2 and (i1<1 or i1>9999) then
                            res:= 7 <*busnr ulovligt*>
                    else if a_res=2 or a_res=6 then
                    begin
                      ia(nr+1):=i1+ (if a_res=6 then 1 shift 22 else 0);
                      indeks:= nr+1;
                    end
                    else res:=27; <* parametertype *>
                  end
                  else
                    res:=if a_res=0 then  2 <*godkendt *>
                                    else 24;<* syntaks *>
                  if res<4 then pos:=a_pos;
                end; <* partype 13 *>
    \f

    message procedure læs_kommando side 17 - 810311/hko;
    
    <*14: <linie>.<indeks> *>
    
                begin
                  if nr=1 then
                  begin
                    if a_res=0 then res:=25 <* parameter mangler *>
                    else if a_res=9 then
                    begin
                      ia(1):= 1 shift 23 +i1;
                      ia(2):= værdi(2);
                    end
                    else res:=27; <* parametertype *>
                  end
                  else <* nr>1 *>
                    res:= if a_res=0 then  2 <* godkendt *>
                                     else 24;<* syntaks *>
                end; <* partype 14 *>
    \f

    message procedure læs_kommando side 18 - 810313/hko;
    
    <*15: <linie>.<indeks> <bus> *>
    
                begin
                  if nr=1 then
                  begin
                    if a_res=0 then res:= 25 <* parameter mangler *>
                    else if a_res=9 then
                    begin
                      ia(1):= 1 shift 23 +i1;
                      ia(2):= værdi(2);
                    end
                    else res:=27; <* parametertype *>
                  end
                  else if nr=2 then
                  begin
                    if a_res=0 then res:=25
                    else if a_res=2 then
                    begin
                      if i1<1 or i1>9999 then res:=7 <* ulovligt busnr *>
                      else ia(3):= i1;
                    end
                    else res:=27; <*parametertype *>
                  end
                  else
                    res:=if a_res=0 then  2 <* godkendt *>
                                    else 24;<* syntaks *>
                  if res<4 then pos:=a_pos;
                end; <* partype 15 *>
    \f

    message procedure læs_kommando side 19 - 810311/hko;
    
    <*16: (<ingenting>!D.<dato>.<klokkeslet> *>
    
                begin
                  if nr=1 then
                  begin
                    if a_res=0 then res:=2 <* godkendt *>
                    else if a_res=12 then
                    begin
                      raf:=0;
                      ia.raf(1):= systid(i1,værdi(2));
                    end
                    else res:=27; <* parametertype *>
                  end
                  else
                    res:= if a_res=0 then  2 <* godkendt *>
                                     else 24;<* syntaks *>
                  if res<4 then pos:=a_pos;
                end; <* partype 16 *>
    \f

    message procedure læs_kommando side 20 - 810511/hko;
    
    <*17: G<grp.nr> *>
    
                begin
                  if nr=1 then
                  begin
                    if a_res=0 then res:=25 <*parameter mangler *>
                    else if a_res=5 then
                    begin
                      ia(1):= 5 shift 21 +i1;
                    end
                    else res:=27; <* parametertype *>
                  end
                  else
                    res:= if a_res=0 then  2 <* godkendt *>
                                     else 24;<* syntaks *>
                end; <* partype 17 *>
    
    <*               att_op_længde//2 *>
    <*18: (<heltal>)                  *>
    <*               1                *>
    
                begin
                  if nr=1 and a_res=0 then res:= 25 <*parameter mangler*>
                  else
                  if nr<=att_op_længde//2 then
                  begin
                    if a_res=2 or a_res=3 <* pos/neg heltal *> then
                    begin
                      ia(nr):= i1; indeks:= nr;
                    end
                    else if a_res=0 then res:= 2
                    else res:= 27; <*parametertype*>
                  end
                  else
                  res:= if a_res=0 then 2 else 24;<*syntaks (for mange)*>
                end;
    \f

    message procedure læs_kommando side 21 - 820302/cl;
    
    <*19: <linie>/<løb>  <linie>/<løb> *>
    
                begin
                  if nr<3 and a_res=0 then res:= 25 <*parameter mangler*>
                  else if nr<3 and a_res<>6 then res:= 27 <*parametertype*>
                  else if nr<3 then
                  begin
                    ia(nr):=i1 + 1 shift 22;
                  end
                  else
                    res:= if a_res=0 then 2 <*godkendt*>
                                    else 24;<*syntaks (for mange)*>
                  if res<4 then pos:= a_pos;
                end; <* partype 19 *>
    
    <*20: <busnr> <kortnavn> *>
                begin
                  if nr=1 then
                  begin
                    if ares=0 then res:= 25 else
                    if ares=2 and (i1<1 or 9999<i1) then res:= 24 else
                    if ares<>2 then res:= 27 else ia(1):= i1;
                  end
                  else
                  if nr=2 then
                  begin
                    if ares=1 and værdi(2) extract 8 = 0 then
                    begin
                      ia(2):= værdi(1); ia(3):= værdi(2);
                    end
                    else res:= if ares=0 then 25 else if ares=1 then 62 else 27;
                  end
                  else
                  if ares=0 then res:= 2 else res:= 24;
                end; <* partype 20 *>
    \f

    message procedure læs_kommando side 22 - 851001/cl;
    
    <*                2                                     *>
    <*21:  ( <linie> )    (<garage> ! OMR (ALL ! <område>)) *>
    <*                0                                     *>
    
                begin
                  laf:= 0;
                  if nr=1 and a_res=0 then res:= 25 <*parameter mangler*>
                  else if a_res=0 and (ia(3)=-2 or ia(3)=0) then res:= 25
                  else if a_res<>0 and nr>4 then res:= 24 <*syntaks (for mange)*>
                  else if a_res=0 then res:= 2 <*godkendt*>
                  else if a_res=2 and (i1<1 or i1>999) then res:= 5 <*ulovligt*>
                  else if (a_res=2 or a_res=4) and nr<=2 then
                  begin
                    if ia(3)<>0 then res:= 27 else
                    ia(nr):= (4 shift 21) + (if a_res=2 then i1 shift 5 else i1);
                  end
                  else
                  if ares=1 then
                  begin
                    if nr=1 then
                    begin
                      ia(1):= (4 shift 21) + (1 shift 5);
                      ia(2):= (4 shift 21) + (999 shift 5);
                    end;
                    if ia(3)=-2 then
                    begin
                      if i1=long<:ALL:> shift (-24) extract 24 then
                        ia(3):= -1
                      else
                      begin
                        ia(3):= findområde(i1);
                        if ia(3)=0 then res:= 56 else
                        ia(3):= 14 shift 20 + ia(3);
                      end;
                    end
                    else
                    if ia(3) = 0 then
                    begin
                      if i1 = long<:OMR:> shift (-24) extract (24) then 
                        ia(3):= -2
                      else
                        ia(3):= find_bpl(værdi.laf(1));
                      if ia(3)=0 then res:= 55;
                    end
                    else res:= 24;
                  end
                  else res:= 27; <*parametertype*>
                  if res<4 then pos:= apos;
                end;
    
    <*22: (<busnr> (<område) ! <linie>/<løb> (<område>) ) *>
    
                begin
                  if nr=1 then
                  begin
                    if ares=0 then res:= 25 <*parameter mangler*>
                    else if ares=2 and (i1<1 or i1>9999) 
                         then res:= 7 <* busnr ulovligt *>
                    else if ares=2 or ares=6 then
                    begin
                      ia(1):= if ares=2 then i1 else 1 shift 22 + i1;
                    end
                    else res:= 27 <* parametertype *>
                  end
                  else
                  if nr=2 then
                  begin
                    if ares=0 then res:= 2 <* godkendt *>
                    else if ares=1 then
                    begin
                      ia(2):= findområde(i1);
                      if ia(2)=0 then res:= 17 <*kanal ukendt*>
                    end
                    else
                      res:= 27; <* parametertype *>
                  end
                  else if ares=0 then res:= 2 <*godkendt*>
                                 else res:= 24; <*syntaks*>
                  if res < 4 then pos:= apos;
                end;
    
    <*23: ( <linie> (<område>) ! G<nr> (<område>) ) *>
    
                begin
                  if nr=1 then
                  begin
                    if ares=0 then res:= 25 else
                    if ares=2 and (i1<1 or i1>999) then res:= 5 else
                    if ares=2 or ares=4 or ares=5 then
                    begin
                      ia(1):=
                        if ares=2 then 4 shift 21 + i1 shift 5 else
                        if ares=4 then 4 shift 21 + i1         else
                                       5 shift 21 + i1;
                    end
                    else res:= 27;
                    if res < 4 then pos:= apos;
                  end
                  else
                  if nr=2 then
                  begin
                    if ares=0 then res:= 2 else
                    if ares=1 then
                    begin
                      ia(2):= findområde(i1);
                      if ia(2)=0 then res:= 17;
                    end
                    else res:= 27;
                  end
                  else
                  if ares=0 then res:= 2 else res:= 24;
                end;
    
    <*24: ( <ingenting> ! <område> ! * ) *>
    
                begin
                  if nr=1 then
                  begin
                    if ares=0 then res:= 2 else
                    if ares=1 then
                    begin
                      if i1=long<:ALL:> shift (-24) extract 24 then
                        ia(1):= (-1) shift (-3) shift 3
                      else
                      begin
                        k:= findområde(i1);
                        if k=0 then res:= 17 else
                           ia(1):= 14 shift 20 + k;
                      end;
                    end
                    else res:= 27;
                  end
                  else
                  if ares=0 then res:= 2 else res:= 24;
                  if res < 4 then pos:= apos;
                end;
    
    <*25: <område> *>
    
                begin
                  if nr=1 then
                  begin
                    if ares=0 then res:= 25 else
                    if ares=1 then
                    begin
                      if i1 = '*' shift 16 then ia(1):= -1 else
                         ia(1):= findområde(i1);
                      if ia(1)=0 then res:= 17;
                    end
                    else res:= 27;
                  end
                  else
                  if ares=0 then res:= 2 else res:= 24;
                  if res < 4 then pos:= apos;
                end;
    
    <*26: <busnr> *>
                begin
                  if nr=1 then
                  begin
                    if ares=0 then res:= 25 else
                    if ares=2 and (i1<1 or 9999<i1) then res:= 24 else
                    if ares<>2 then res:= 27 else ia(1):= i1;
                  end
                  else
                  if ares=0 then res:= 2 else res:= 24;
                end;
    
    <*                           8 *>
    <*27: <operatørnr> (<område>)  *>
    <*                           1 *>
                begin
                  if nr < 3 and a_res=0 then res:= 25 <*parameter mangler*>
                  else if nr=1 then
                  begin
                    if a_res=2 then
                    begin
                      ia(1):= i1;
                      if i1 < 0 or max_antal_operatører < i1 then res:= 28;
                    end
                    else if a_res=1 then
                    begin
                      laf:= 0;
                      ia(1):= find_bpl(værdi.laf(1));
                      if ia(1)<1 or ia(1)>max_antal_operatører then res:=28;
                    end
                    else res:= 27; <*parametertype*>
                  end
                  else
                  begin
                    if a_res=0 then res:= (if nr > 2 then 2 else 25)
                    else if nr > 9 then res:= 24
                    else if a_res=1 then
                    begin
                      ia(nr):= find_område(i1);
                      indeks:= nr;
                      if ia(nr)=0 then res:= 56;
                    end
                    else res:= 27;
                  end;
                  if res < 4 then pos:= a_pos;
                end <* partype 27 *>;
    
    <*28: (<ingenting>!<kanalnr>) *>
                begin
                  long field lf;
    
                  if nr=1 then
                  begin
                    if ares=0 then res:= 2 else
                    if ares=1 then
                    begin
                      j:= 0; lf:= 4;
                      for i:= 1 step 1 until max_antal_kanaler do
                        if kanal_navn(i)=værdi.lf then j:= i;
                      if j<>0 then
                      begin
                        ia(1):= 3 shift 22 + j;
                        res:= 2;
                      end
                      else
                        res:= 17; <*kanal ukendt*>
                    end
                    else
                      res:= 27; <*parametertype*>
                    if res < 4 then pos:= apos;
                  end
                  else
                    res:= if nr=2 and ares<>0 then 24 <*syntaks*> else 2 <*ok*>;
                end;
    
    <*                                    n  *>
    <*29:  <btj.pl.navn> ( <operatørnavn>)   *>
    <*                                    0  *>
                begin
                  laf:= 0;
                  if nr=1 then
                  begin
                    if a_res=0 then res:= 25 <*parameter mangler*>
                    else if a_res<>1 or værdi(2) extract 8 <>0 then res:= 27
                    else begin
                      indeks:= 2;
                      ia(1):= værdi(1); ia(2):= værdi(2);
                      j:= find_bpl(værdi.laf(1));
                      if 0<j and j<=max_antal_operatører then
                        res:= 62; <*ulovligt navn*>
                    end;
                  end
                  else
                  begin
                    if a_res=0 then res:= 2 <*godkendt*>
                    else if a_res<>1 then res:= 27 <*parametertype*>
                    else begin
                      indeks:= indeks+1;
                      ia(indeks):= find_bpl(værdi.laf(1));
                      if ia(indeks)=0 or ia(indeks)>max_antal_operatører then
                        res:= 28; <*ukendt operatør*>
                    end;
                  end;
                  if res<4 then pos:= a_pos;
                end;
                
    <*                                        3  *>
    <*30:  (<operatørnavn>)   ( <btj.pl.navn>)   *>
    <*                     io                 0  *>
          
                begin
                  boolean io;
    
                  io:= (kilde//100 = 1);
                  laf:= 0;
                  if -,io and nr=1 then
                  begin
                    indeks:= 1;
                    ia(1):= kilde mod 100; <*egen operatørplads*>
                  end;
    
                  if io and nr=1 then
                  begin
                    if a_res=0 then res:= 25 <*parameter mangler*>
                    else if a_res<>1 then res:= 27 <*parametertype*>
                    else begin
                      indeks:= nr;
                      ia(indeks):= find_bpl(værdi.laf(1));
                      if ia(indeks)=0 or ia(indeks)>max_antal_operatører then
                        res:= 28; <*ukendt operatør*>
                    end;
                  end
                  else
                  begin
                    if a_res=0 then res:= 2<*godkendt*> 
                    else if indeks=4 then res:= 24 <*syntaks, for mange*>
                    else if a_res<>1 then res:= 27 <*parametertype*>
                    else begin
                      indeks:= indeks+1;
                      ia(indeks):= find_bpl(værdi.laf(1));
                      if ia(indeks)=0 then res:= 46 <*navn ukendt*>
                      else if ia(indeks)=ia(1) then res:= 62; <*ulovligt navn*>
                    end;
                  end;
                  if res<4 then pos:= a_pos;
                end;
                    
    <*                                               *>
    <*31:  <operatørnr> ( <navn> (<ingenting>!Å!S) ) *>
    <*                                               *>
    
                begin
                  laf:= 0;
                  if nr<2 and a_res=0 then res:= 25 <*parameter mangler*>
                  else
                  if nr=1 then
                  begin
                    if a_res=2 then
                    begin
                      ia(1):= i1;
                      if i1<=0 or max_antal_operatører<i1 then res:= 28; <*ukendt*>
                    end else res:= 27; <*parametertype*>
                  end
                  else
                  if nr=2 then
                  begin
                    if a_res=1 and værdi(2) extract 8 = 0 then
                    begin
                      ia(2):= værdi(1); ia(3):= værdi(2);
                      j:= find_bpl(værdi.laf(1));
                      if j>0 and j<>ia(1) then res:= 48 <*i brug*>;
                    end
                    else res:= if a_res=0 then 2 <*godkendt*> 
                                          else 27 <*parametertype*>;
                  end 
                  else
                  if nr=3 then
                  begin
                    if a_res=0 then res:=2 <*godkendt*>
                    else if a_res<>1 then res:= 27 <*parametertype*>
                    else begin
                      j:= værdi(1) shift (-16);
                      if j='Å' then ia(4):=  1 else
                      if j='S' then ia(4):=  3 else res:= 24 <*syntaks*>;
                    end;
                  end
                  else res:= if a_res=0 then 2 <*godkendt*> else 24 <*syntaks*>;
                  if res<4 then pos:= a_pos;
                end;
    
    <*            1   *>
    <*32: (heltal)    *>
    <*            0   *>
                begin
                  if nr=1 then
                  begin
                    if ares=0 then
                    begin
                      indeks:= 0; res:= 2;
                    end
                    else
                    if ares=2 or ares=3 then
                    begin
                      ia(nr):= i1; indeks:= nr;
                    end
                    else res:=27; <*parametertype*>
                  end
                  else
                    res:= (if ares<>0 then 24 <*syntaks, for mange*> else 2);
                  if res < 4 then pos:= a_pos;
                end;
    
    <*33 generel tekst*>
                begin 
                  integer p,p1,ch,lgd;
    
                  if nr=1 and a_res<>0 then
                  begin
                    p:=pos; p1:=1;
                    lgd:= (op_spool_postlgd-op_spool_text)//2*3-1;
                    if 95<lgd then lgd:=95;
                    repeat læstegn(d.opref.data,p,ch) until ch<>' ';
                    while ch<>'nl' and ch<>'em' and ch<>0 and p1<lgd do
                    begin
                      skrivtegn(ia,p1,ch);
                      læstegn(d.opref.data,p,ch);
                    end;
                    if p1=1 then res:= 25 else res:= 2;
                    repeat skrivtegn(ia,p1,0) until (p1 mod 6)=1;
                  end
                  else
                  if a_res=0 then res:= 25 else res:= 24;
                end;
    
    <*34: (heltal)    *>
                begin
                  if nr=1 then
                  begin
                    if ares=0 then res:= 25 else
                    if ares=2 or ares=3 then
                    begin
                      ia(nr):= i1; indeks:= nr;
                    end
                    else res:=27; <*parametertype*>
                  end
                  else
                    res:= (if ares<>0 then 24 <*syntaks, for mange*> else 2);
                  if res < 4 then pos:= a_pos;
                end;
                
    <*+4*>      begin
                  fejlreaktion(4<*systemfejl*>,partype,
                               <:parametertype fejl i kommandofil:>,1);
                  res:=31;
                end
    <*-4*>
              end;<*case partype*>
            end;<* while læs_param_sæt *>
          end; <* operationskode ok *>
        end
        else
        begin
          fejlreaktion(3<*programfejl*>,kilde,<:kilde:>,1);
        end;
    
        if a_res<0 then res:= -a_res;
    slut_læskommando:
    
        læs_kommando:=d.op_ref.resultat:= res;
      end;<* disable-blok*>
    end læs_kommando;
    \f

    message procedure skriv_kvittering side 1 - 820301/hko/cl;
    
    procedure skriv_kvittering(z,ref,pos,res);
      value                      ref,pos,res;
      zone                     z;
      integer                    ref,pos,res;
      begin
        integer array field op;
        integer pos1,tegn;
        op:=ref;
        if res<1 or res>3 then write(z,<:*** :>);
        write(z,case res+1 of (
    <* 0*><:ubehandlet:>,
    <* 1*><:ok:>,
    <* 2*><:godkendt:>,
    <* 3*><:udført:>,
    <* 4*><:kommando ukendt:>,
    
    <* 5*><:linie-nr ulovligt:>,
    <* 6*><:løb-nr ulovligt:>,
    <* 7*><:bus-nr ulovligt:>,
    <* 8*><:gruppe ukendt:>,
    <* 9*><:linie/løb ukendt:>,
    
    <*10*><:bus-nr ukendt:>,
    <*11*><:bus allerede indsat på :>,
    <*12*><:linie/løb allerede besat af :>,
    <*13*><:bus ikke indsat:>,
    <*14*><:bus optaget:>,
    
    <*15*><:gruppe optaget:>,
    <*16*><:skærm optaget:>,
    <*17*><:kanal ukendt:>,
    <*18*><:bus i kø:>,
    <*19*><:kø er tom:>,
    
    <*20*><:ej forbindelse :>,
    <*21*><:ingen at gennemstille til:>,
    <*22*><:ingen samtale at nedlægge:>,
    <*23*><:ingen samtale at monitere:>,
    <*24*><:syntaks:>,
    
    <*25*><:syntaks, parameter mangler:>,
    <*26*><:syntaks, skilletegn:>,
    <*27*><:syntaks, parametertype:>,
    <*28*><:operatør ukendt:>,
    <*29*><:garageterminal ukendt:>,
    \f

    
    <*30*><:rapport kan ikke dannes:>,
    <*31*><:systemfejl:>,
    <*32*><:ingen fri plads:>,
    <*33*><:gruppe for stor:>,
    <*34*><:gruppe allerede defineret:>,
    
    <*35*><:springsekvens for stor:>,
    <*36*><:spring allerede defineret:>,
    <*37*><:spring ukendt:>,
    <*38*><:spring allerede igangsat:>,
    <*39*><:bus ikke reserveret:>,
    
    <*40*><:gruppe ikke reserveret:>,
    <*41*><:spring ikke igangsat:>,
    <*42*><:intet frit linie/løb:>,
    <*43*><:ændring af dato/tid ikke lovlig:>,
    <*44*><:interval-størrelse ulovlig:>,
    
    <*45*><:ikke implementeret:>,
    <*46*><:navn ukendt:>,
    <*47*><:forkert indhold:>,
    <*48*><:i brug:>,
    <*49*><:ingen samtale igang:>,
    
    <*50*><:kanal:>,
    <*51*><:afvist:>,
    <*52*><:kanal optaget :>,
    <*53*><:annulleret:>,
    <*54*><:ingen busser at kalde op:>,
    
    <*55*><:garagenavn ukendt:>,
    <*56*><:område ukendt:>,
    <*57*><:område nødvendigt:>,
    <*58*><:ulovligt område for bus:>,
    <*59*><:radiofejl :>,
    
    <*60*><:område kan ikke opdateres:>,
    <*61*><:ingen talevej:>,
    <*62*><:ulovligt navn:>,
    <*63*><:alarmlængde: :>,
    <*64*><:ulovligt tal:>,
    
    <*99*><:- <'?'> -:>));
    \f

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

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

    message procedure attention side 1 - 810529/hko;
    
      procedure attention;
      begin
        integer i, j, k;
        integer array field op_ref,mess_ref;
        integer array att_message(1:9);
        long array field laf1, laf2;
        boolean optaget;
      procedure skriv_attention(zud,omfang);
        integer                     omfang;
        zone                    zud;
      begin
        write(zud,"nl",1,<:+++ attention            :>);
        if omfang <> 0 then
        disable begin integer x;
          trap(slut);
          write(zud,"nl",1,
            <:  i:         :>,i,"nl",1,
            <:  j:         :>,j,"nl",1,
            <:  k:         :>,k,"nl",1,
            <:  op-ref:    :>,op_ref,"nl",1,
            <:  mess-ref:  :>,mess_ref,"nl",1,
            <:  optaget:   :>,if optaget then <:true:>else<:false:>,"nl",1,
            <:  laf2       :>,laf2,"nl",1,
            <:  att-message::>,"nl",1,
            <::>);
          raf:= 0;
          skriv_hele(zud,att_message.raf,18,127);
          skriv_coru(zud,coru_no(010));
    slut:
        end;
      end skriv_attention;
    
      integer procedure udtag_tal(tekst,pos);
        long array tekst;
        integer pos;
      begin
        integer i;
    
        if getnumber(tekst,pos,i) >= 0 then
          udtag_tal:= i
        else
          udtag_tal:= 0;
      end;
    
      for i:= 1 step 1 until att_maske_lgd//2 do
         att_signal(i):=att_flag(i):=0;
      trap(att_trap);
      stack_claim((if cm_test then 198 else 146)+50);
    <*+2*>
      if testbit26 and overvåget or testbit28 then
        skriv_attention(out,0);
    <*-2*>
    \f

    message procedure attention side 2 - 810406/hko;
    
      repeat
    
        wait_ch(cs_att_pulje,opref,true,-1<*vent ubegrænset*>);
    
        repeat
    <*V*> c_wait_message(att_proc_ref,att_message,mess_ref,-1<*vent ubegrænset*>);
          raf:= laf1:= 0;
          laf:=core.mess_ref(4)+2;  <* reference til sender-procesnavn *>
    
    <*+2*>if testbit7 and overvåget then
          disable begin
            laf2:= abs(laf);
            write(out,"nl",1,<:attention - :>);
            if laf<=0 then write(out,<:Regrettet :>);
            write(out,<:Message modtaget fra :>);
            if laf2 > 0 then write(out,core.laf2) else write(out,<:???:>);
            skriv_hele(out,att_message.raf,16,127);
            ud;
          end;
    <*-2*>
    \f

    message procedure attention side 3 - 830310/cl;
    
          if laf <= 0 then
            i:= -1
          else
          if core.laf(1)=konsol_navn.laf1(1)
               and core.laf(2)=konsol_navn.laf1(2) then 
            i:= 101
          else
          begin
            i:= -1; j:= 1;
            while i=(-1) and (j <= max_antal_operatører) do
            begin
              laf2:= (j-1)*8;
              if core.laf(1) = terminal_navn.laf2(1) 
                 and core.laf(2) = terminal_navn.laf2(2) then i:= 200+j;
              j:= j+1;
            end;
            j:= 1;
            while i=(-1) and (j<=max_antal_garageterminaler) do
            begin
              laf2:= (j-1)*8;
              if core.laf(1) = garage_terminal_navn.laf2(1) 
                 and core.laf(2) = garage_terminal_navn.laf2(2) then i:= 300+j;
              j:= j+1;
            end;
          end;
    
          if i=101 or (201<=i and i<=200+max_antal_operatører)
                <* or (301<=i and i<=300+max_antal_garageterminaler) *>
          then
          begin
    
            j:= if i=101 then 0 
                else max_antal_operatører*(i//100-2)+i mod 100;
    
            ref:=j*terminal_beskr_længde;
            att_message(9):=
                      if terminal_tab.ref.terminal_tilstand>=0 then 1 <*normal*>
                      else 4 <*disconnected*>;
            optaget:=læsbit_ia(att_flag,j);
            if optaget and att_message(9)=1 then
              sætbit_ia(att_signal,j,0<*1 for 'husket' attention*>)
            else optaget:=optaget or att_message(9)<>1;
            if i//100=2 and terminal_tab.ref.terminal_tilstand < 0 then
            begin <* att fra ekskluderet operatør - inkluder *>
              start_operation(op_ref,010,cs_att_pulje,1<*IN,O*>);
              d.op_ref.data(1):= i mod 100;
              signalch(cs_rad,op_ref,gen_optype);
              waitch(cs_att_pulje,op_ref,true,-1);
            end;
          end
          else
          begin
            optaget:= true;
            att_message(9):= 2 <*rejected*>;
          end;
    
          monitor(22)send_answer:(zdummy,mess_ref,att_message);
    
        until -,optaget;
    \f

    message procedure attention side 4 - 810424/hko;
    
        sætbit_ia(att_flag,j,1);
    
        start_operation(op_ref,i,cs_att_pulje,0);
    
        signal_ch(case i//100 of (cs_io,cs_op,cs_gar),op_ref,gen_optype);
    
      until false;
    
    att_trap:
    
      skriv_attention(zbillede,1);
    
    
      end attention;
    
    \f

    message io_erklæringer side 1 - 810421/hko;
    
      integer
        cs_io,
        cs_io_komm,
        cs_io_fil,
        cs_io_spool,
        cs_io_medd,
        cs_io_nulstil,
        ss_io_spool_tomme,
        ss_io_spool_fulde,
        bs_zio_adgang,
        io_spool_fil,
        io_spool_postantal,
        io_spool_postlængde;
    
      integer array field
        io_spool_post;
    
      zone z_io(32,1,io_fejl);
    
      procedure io_fejl(z,s,b);
        integer           s,b;
        zone            z;
      begin
        disable begin
          integer array iz(1:20);
          integer i,j,k;
          integer array field iaf;
          real array field raf;
          if s<>(1 shift 21 + 2) then
          begin
            getzone6(z,iz);
            raf:=2;
            iaf:=0;
            k:=1;
    
            j:= terminal_tab.iaf.terminal_tilstand;
            if j shift(-21)<>6 then
              fejlreaktion(17<*ydre enhed status*>,s,string iz.raf(increase(k)),
                           1 shift 12 <*binært*> +1 <*fortsæt*>);
            terminal_tab.iaf.terminal_tilstand:= 6 shift 21
                + terminal_tab.iaf.terminal_tilstand extract 21;
          end;
          z(1):=real <:<'?'><'?'><'em'>:>;
          b:=2;
        end; <*disable*>
      end io_fejl;
    \f

    message procedure skriv_auto_spring_medd side 1 - 820301/hko;
    
      procedure skriv_auto_spring_medd(z,medd,tid);
        value                                 tid;
        zone                           z;
        real                                  tid;
        integer array                    medd;
        begin
          disable begin
            real t;
            integer kode,bus,linie,bogst,løb,dato,kl;
            long array indeks(1:1);
            kode:= medd(1);
            indeks(1):= extend medd(5) shift 24;
            if kode > 0 and kode < 10 then
            begin
              write(z,"nl",0,<:-<'>'>:>,case kode of(
            <*1*><:linie/løb ikke indsat    :>,<*sletning/omkodning/spring       *>
            <*2*><:linie/løb allerede indsat:>,<*omkodning/spring                *>
            <*3*><:vogn i kø:>,                <*påmindelse i forb. omkod./spring*>
            <*4*><:vogn optaget:>,             <*    -      i  -      -   /   -  *>
            <*5*><:spring annulleret:>,        <*udløb af ventetid               *>
            <*6*><::>,                         <*  -   af springliste            *>
            <*7*><::>,                         <*start af springsekvens          *>
            <*8*><::>,                         <*afvikling af springsekvens      *>
            <*9*><:område kan ikke opdateres:>,<*vt-ændring*>
            <::>));
    <*        if kode = 5 then
              begin
                bogst:= medd(4);
                linie:= bogst shift(-5) extract 10;
                bogst:= bogst extract 5;
                if bogst > 0 then bogst:= bogst +'A'-1;
                write(z,"sp",1,<<z>,linie,false add bogst,1,
                      ".",1,indeks);
              end;
    *>
              outchar(z,'sp');
              bus:= medd(2) extract 14;
              if bus > 0 then
                write(z,<<z>,bus,"/",1);
              løb:= medd(3);
    <*+4*>    if løb shift(-22) <> 1 and løb <> 0 then
                fejlreaktion(3<*programfejl*>,løb,<:ikke linie id, spon.medd.:>,1);
    <*-4*>
    \f

    message procedure skriv_auto_spring_medd side 2 - 810507/hko;
    
              linie:= løb shift(-12) extract 10;
              bogst:= løb shift(-7) extract 5;
              if bogst > 0 then bogst:= bogst +'A'-1;
              løb:= løb extract 7;
              if medd(3) <> 0 or kode <> 5 then
              begin
                write(z,<<z>,linie,false add bogst,1,"/",1,løb,"sp",1);
                if kode = 5 or kode = 6 then write(z,<:er frit :>);
              end;
              if kode = 7 or kode = 8 then
                write(z,<*indeks,"sp",1,*>
                  if kode=7 then <:udtaget :> else <:indsat :>);
    
              dato:= systime(4,tid,t);
              kl:= t/100.0;
              løb:= replace_char(1<*space in number*>,'.');
              write(z,<<zd_dd_dd>,dato,<< zd_dd>,kl);
              replace_char(1,løb);
            end
            else <*kode < 1 or kode > 8*>
              fejlreaktion(3<*programfejl*>,kode,<:spon.medd. kode:>,1);
          end; <*disable*>
        end skriv_auto_spring_medd;
    \f

    message procedure h_io side 1 - 810507/hko;
    
      <* hovedmodulkorutine for io *>
      procedure h_io;
      begin
        integer array field op_ref;
        integer k,dest_sem;
        procedure skriv_hio(zud,omfang);
          value                     omfang;
          zone                  zud;
          integer                   omfang;
          begin
    
            write(zud,"nl",1,<:+++ hovedmodul io        :>);
            if omfang>0 then
            disable begin integer x;
              trap(slut);
              write(zud,"nl",1,
                <:  op_ref:    :>,op_ref,"nl",1,
                <:  k:         :>,k,"nl",1,
                <:  dest_sem:  :>,dest_sem,"nl",1,
                <::>);
              skriv_coru(zud,coru_no(100));
    slut:
            end;
         end skriv_hio;
    
      trap(hio_trap);
      stack_claim(if cm_test then 198 else 146);
    
    <*+2*>
      if testbit0 and overvåget or testbit28 then
        skriv_hio(out,0);
    <*-2*>
    \f

    message procedure h_io side 2 - 810507/hko;
    
      repeat
        wait_ch(cs_io,op_ref,true,-1);
    <*+4*>
        if (d.op_ref.optype and (io_optype or gen_optype)) extract 12 =0
        then fejlreaktion(12<*operationstype*>,op_ref,<:operation til io:>,1);
    <*-4*>
    
        k:=d.op_ref.opkode extract 12;
        dest_sem:=
          if k =  0 <*attention*> then cs_io_komm else
          
          if k = 22 <*auto vt opdatering*>
          or k = 23 <*generel meddelelse*>
          or k = 36 <*spring meddelelse*>
          or k = 44 <*udeladt i gruppeopkald*>
          or k = 45 <*nødopkald modtaget*>
          or k = 46 <*nødopkald besvaret*> then cs_io_spool else
    
          if k = 38 <*meddelelse til alle skærme*> then cs_io_medd else
          0;
    <*+4*>
        if dest_sem = 0 then
        begin
          fejl_reaktion(2<*operationskode*>,k,<:hovedmodul io:>,1);
          signal_ch(d.op_ref.retur,op_ref,d.op_ref.optype);
        end
        else
    <*-4*>
        begin
          signal_ch(dest_sem,op_ref,d.op_ref.optype);
        end;
      until false;
    
    hio_trap:
      disable skriv_hio(zbillede,1);
      end h_io;
    \f

    message procedure io_komm side 1 - 810507/hko;
    
      procedure io_komm;
      begin
        integer array field op_ref,ref,vt_op,iaf;
        integer kode,aktion,status,opgave,dest_sem,vogn,ll,omr,
                pos,indeks,sep,sluttegn,operatør,i,j,k;
        long navn;
    
        procedure skriv_io_komm(zud,omfang);
          value                     omfang;
          zone                  zud;
          integer                   omfang;
          begin
    
        disable
    
            write(zud,"nl",1,<:+++ io_komm              :>);
            if omfang > 0 then
            disable begin integer x;
              trap(slut);
              write(zud,"nl",1,
                <:  op-ref:    :>,op_ref,"nl",1,
                <:  kode:      :>,kode,"nl",1,
                <:  aktion:    :>,aktion,"nl",1,
                <:  ref:       :>,ref,"nl",1,
                <:  vt_op:     :>,vt_op,"nl",1,
                <:  status:    :>,status,"nl",1,
                <:  opgave:    :>,opgave,"nl",1,
                <:  dest-sem:  :>,dest_sem,"nl",1,
                <:  iaf:       :>,iaf,"nl",1,
                <:  i:         :>,i,"nl",1,
                <:  j:         :>,j,"nl",1,
                <:  k:         :>,k,"nl",1,
                <:  navn:      :>,string navn,"nl",1,
                <:  pos:       :>,pos,"nl",1,
                <:  indeks:    :>,indeks,"nl",1,
                <:  sep:       :>,sep,"nl",1,
                <:  sluttegn:  :>,sluttegn,"nl",1,
                <:  vogn:      :>,vogn,"nl",1,
                <:  ll:        :>,ll,"nl",1,
                <:  omr:       :>,omr,"nl",1,
                <:  operatør:  :>,operatør,"nl",1,
                <::>);
              skriv_coru(zud,coru_no(101));
    slut:
            end;
          end skriv_io_komm;
    \f

    message procedure io_komm side 2 - 810424/hko;
    
        trap(io_komm_trap);
        stack_claim((if cm_test then 200 else 146)+24+200);
    
        ref:=0;
        navn:= long<::>;
        
    <*+2*>
        if testbit0 and overvåget or testbit28 then
          skriv_io_komm(out,0);
    <*-2*>
    
        repeat
    
    <*V*> wait_ch(cs_io_komm,
                  op_ref,
                  true,
                  -1<*timeout*>);
    <*+2*>
          if testbit1 and overvåget then
          disable begin
            skriv_io_komm(out,0);
            write(out,"nl",1,<:operation fra cs:>,<<d>,cs_io,
                             <: til io :>);
            skriv_op(out,op_ref);
          end;
    <*-2*>
    
          kode:= d.op_ref.op_kode;
          i:= terminal_tab.ref.terminal_tilstand;
          status:= i shift(-21);
          opgave:=
            if kode=0 then 1 <* indlæs kommando *> else
            0; <* afvises *>
    
          aktion:= if opgave = 0 then 0 else
                     (case status +1 of(
          <* status         *>
          <* 0 klar         *>(1),
          <* 1 -            *>(-1),<* ulovlig tilstand *>
          <* 2 -            *>(-1),<* ulovlig tilstand *>
          <* 3 stoppet      *>(2),
          <* 4 noneksist    *>(-1),<* ulovlig tilstand *>
          <* 5 -            *>(-1),<* ulovlig tilstand *>
          <* 6 -            *>(-1),<* ulovlig tilstand *>
          <* 7 ej knyttet   *>(-1),<* ulovlig tilstand *>
                              -1));
    \f

    message procedure io_komm side 3 - 810428/hko;
    
          case aktion+6 of
          begin
            begin
              <*-5: terminal optaget *>
    
              d.op_ref.resultat:= 16;
              afslut_operation(op_ref,-1);
            end;
    
            begin
              <*-4: operation uden virkning *>
    
              afslut_operation(op_ref,-1);
            end;
    
            begin
              <*-3: ulovlig operationskode *>
    
              fejl_reaktion(2<*operationskode*>,kode,<:ulovlig:>,1);
              afslut_operation(op_ref,-1);
            end;
    
            begin
              <*-2: ulovlig aktion *>
    
              fejl_reaktion(3<*programfejl*>,-2,<: ulovlig aktion:>,0);
              afslut_operation(op_ref,-1);
            end;
    
            begin
              <*-1: ulovlig io_tilstand *>
    
              fejl_reaktion(3<*programfejl*>,status,<: ulovlig io-status:>,0);
              afslut_operation(op_ref,-1);
            end;
    
            begin
              <* 0: ikke implementeret *>
    
              fejl_reaktion(2<*operationskode*>,kode,<: ikke implementeret:>,1);
              afslut_operation(op_ref,-1);
            end;
    
            begin
    \f

    message procedure io_komm side 4 - 851001/cl;
    
              <* 1: indlæs kommando *>
    <*V*>     wait(bs_zio_adgang);
    
    <*V*>     læs_kommando(z_io,101,op_ref,pos,indeks,sep,sluttegn);
    
              if d.op_ref.resultat > 3 then
              begin
    <*V*>       setposition(z_io,0,0);
                if sluttegn<>'nl' then outchar(z_io,'nl');
                skriv_kvittering(z_io,op_ref,pos,
                                 d.op_ref.resultat);
              end
              else if d.op_ref.resultat>0 then
              begin <*godkendt*>
                kode:=d.op_ref.opkode;
                i:= kode extract 12;
                j:= if kode < 5 or
                       kode=7 or kode=8 or
                       kode=72 or kode=73 or kode=74 then 1 <*IN,x/EK,x*>else
                    if kode=5 or kode=77 then 9             <*FO,L/FO,O*>else
                    if kode = 9 or kode=10 then 3           <*VO,B/VO,L*>else
                    if kode =11 or kode=12 or kode=19 or    <*VO,I/VO,U/VO,S*> 
                       kode=20 or kode=24             then 4<*VO,F/VO,R*>else
                    if kode =21 then 5                      <*AU*>       else
                    if kode =25 then 6                      <*GR,D*>     else
                    if kode =26 then 5                      <*GR,S*>     else
                    if kode =27 or kode =28 then 7          <*GR,V/GR,O*>else
                    if kode =30 then 10                     <*SP,D*>     else
                    if kode =31 then 5                      <*SP*>       else
                    if kode =32 or kode =33 then 8          <*SP,V/SP,O*>else
                    if kode =34 or kode =35 then 5          <*SP,R/SP,A*>else
                    if kode=71 then 11                      <*FO,V*>     else
                    if kode =75 then 12                     <*TÆ,V     *>else
                    if kode =76 then 12                     <*TÆ,N     *>else
                    if kode =65 then 13                     <*BE,N     *>else
                    if kode =66 then 14                     <*BE,G     *>else
                    if kode =67 then 15                     <*BE,V     *>else
                    if kode =68 then 16                     <*ST,D     *>else
                    if kode =69 then 17                     <*ST,V     *>else
                    if kode =36 then 18                     <*AL       *>else
                    if kode =37 then 19                     <*CC       *>else
                    if kode>=80 and kode <=88 then 2        <*sys-spec.*>else
                    if kode>=90 and kode <=92 then 20       <*CQF,I/U/V*>else
                    0;
                if j > 0 then
                begin
                  case j of
                  begin
                    begin
    \f

    message procedure io_komm side 5 - 810424/hko;
    
                      <* 1: inkluder/ekskluder ydre enhed *>
    
                      d.op_ref.retur:= cs_io_komm;
                      if kode=1 then d.opref.opkode:= 
                        ia(2) shift 12 + d.opref.opkode extract 12;
                      d.op_ref.data(1):= ia(1);
                      signal_ch(if kode < 5 or kode>=72 then cs_rad
                                            else cs_gar,
                                op_ref,gen_optype or io_optype);
                      indeks:= op_ref;
                      wait_ch(cs_io_komm,
                              op_ref,
                              true,
                              -1<*timeout*>);
    <*+4*>            if op_ref <> indeks then
                        fejlreaktion(11<*fremmed post*>,op_ref,<:io_kommando:>,0);
    <*-4*>
    <*V*>             setposition(z_io,0,0);
                      if sluttegn<>'nl' then outchar(z_io,'nl');
                      skriv_kvittering(z_io,op_ref,-1,
                                       d.op_ref.resultat);
                    end;
    
                    begin
    \f

    message procedure io_komm side 6 - 810501/hko;
    
                      <* 2: tid/attention,ja/attention,nej
                            slut/slut med billede *>
    
                      case d.op_ref.opkode -79 of
                      begin
    
          <* 80: TI *>  begin
                          setposition(z_io,0,0);
                          if sluttegn<>'nl' then outchar(z_io,'nl');
                          if ia(1) <> 0 or ia(2) <> 0 then
                          begin real field rf;
                            rf:= 4;
                            trap(forbudt);
    <*V*>                   setposition(z_io,0,0);
                            systime(3,ia.rf,0.0);
                            if false then
                            begin
                              forbudt: skriv_kvittering(z_io,0,-1,
                                         43<*ændring af dato/tid ikke lovlig*>);
                            end
                            else
                              skriv_kvittering(z_io,0,-1,3);
                          end
                          else
                          begin
                            setposition(z_io,0,0);
                            write(z_io,<<zddddd>,systime(5,0,r),".",1,r);
                          end;
                        end TI;
    \f

    message procedure io_komm side 7 - 810424/hko;
    
          <*81: AT,J*>  begin
    <*V*>                 setposition(z_io,0,0);
                          if sluttegn <> 'nl' then outchar(zio,'nl');
                          monitor(10)release process:(z_io,0,ia);
                          skriv_kvittering(z_io,0,-1,3);
                        end;
    
          <* 82: AT,N*> begin
                          i:= monitor(8)reserve process:(z_io,0,ia);
    <*V*>                 setposition(z_io,0,0);
                          if sluttegn <> 'nl' then outchar(zio,'nl');
                          skriv_kvittering(z_io,0,-1,
                            if i = 0 then 3 else 0);
                        end;
    
          <* 83: SL *>  begin
                          errorbits:=0; <* warning.no ok.yes *>
                          trapmode:= 1 shift 13;
                          trap(-2);
                        end;
    
          <* 84: SL,B *>begin
                          errorbits:=1; <* warning.no ok.no *>
                          trap(-3);
                        end;
          <* 85: SL,K *>begin
                          errorbits:=1; <* warning.no ok.no *>
                          disable sæt_bit_i(trapmode,15,0);
                          trap(-3);
                        end;
    \f

    message procedure io_komm side 7a - 810511/cl;
    
          <* 86: TE,J *>begin
                          setposition(z_io,0,0);
                          if sluttegn <> 'nl' then outchar(z_io,'nl');
                          for i:= 1 step 1 until indeks do
                          if 0<=ia(i) and ia(i)<=47 then
                          begin
                            case (ia(i)+1) of
                            begin
                              testbit0 := true;testbit1 := true;testbit2 := true;
                              testbit3 := true;testbit4 := true;testbit5 := true;
                              testbit6 := true;testbit7 := true;testbit8 := true;
                              testbit9 := true;testbit10:= true;testbit11:= true;
                              testbit12:= true;testbit13:= true;testbit14:= true;
                              testbit15:= true;testbit16:= true;testbit17:= true;
                              testbit18:= true;testbit19:= true;testbit20:= true;
                              testbit21:= true;testbit22:= true;testbit23:= true;
                              testbit24:= true;testbit25:= true;testbit26:= true;
                              testbit27:= true;testbit28:= true;testbit29:= true;
                              testbit30:= true;testbit31:= true;testbit32:= true;
                              testbit33:= true;testbit34:= true;testbit35:= true;
                              testbit36:= true;testbit37:= true;testbit38:= true;
                              testbit39:= true;testbit40:= true;testbit41:= true;
                              testbit42:= true;testbit43:= true;testbit44:= true;
                              testbit45:= true;testbit46:= true;testbit47:= true;
                            end;
                          end;
                          skriv_kvittering(z_io,0,-1,3);
                        end;
    \f

    message procedure io_komm side 7b - 810511/cl;
    
          <* 87: TE,N *>begin
                          setposition(z_io,0,0);
                          if sluttegn <> 'nl' then outchar(z_io,'nl');
                          for i:= 1 step 1 until indeks do
                          if 0<=ia(i) and ia(i)<=47 then
                          begin
                            case (ia(i)+1) of
                            begin
                              testbit0 := false;testbit1 := false;testbit2 := false;
                              testbit3 := false;testbit4 := false;testbit5 := false;
                              testbit6 := false;testbit7 := false;testbit8 := false;
                              testbit9 := false;testbit10:= false;testbit11:= false;
                              testbit12:= false;testbit13:= false;testbit14:= false;
                              testbit15:= false;testbit16:= false;testbit17:= false;
                              testbit18:= false;testbit19:= false;testbit20:= false;
                              testbit21:= false;testbit22:= false;testbit23:= false;
                              testbit24:= false;testbit25:= false;testbit26:= false;
                              testbit27:= false;testbit28:= false;testbit29:= false;
                              testbit30:= false;testbit31:= false;testbit32:= false;
                              testbit33:= false;testbit34:= false;testbit35:= false;
                              testbit36:= false;testbit37:= false;testbit38:= false;
                              testbit39:= false;testbit40:= false;testbit41:= false;
                              testbit42:= false;testbit43:= false;testbit44:= false;
                              testbit45:= false;testbit46:= false;testbit47:= false;
                            end;
                          end;
                          skriv_kvittering(z_io,0,-1,3);
                        end;
    
    <* 88: O    *>      begin
                          integer array odescr,zdescr(1:20);
                          long array field laf;
                          integer res, i, j;
    
                          i:= j:= 1;
                          while læstegn(ia,i,res)<>0 do
                          begin
                            if 'A'<=res and res<='Å' then res:= res - 'A' + 'a';
                            skrivtegn(ia,j,res);
                          end;
    
                          laf:= 2;
                          getzone6(out,odescr);
                          getzone6(z_io,zdescr);
                          close(out,zdescr.laf(1)<>odescr.laf(1) or
                                    zdescr.laf(2)<>odescr.laf(2));
                          laf:= 0;
    
                          if ia(1)=0 then 
                          begin
                            res:= 3;
                            j:= 0;
                          end
                          else
                          begin
                            j:= res:= openbs(out,j,ia,0);
                            if res<>0 then
                              res:= 46;
                          end;
                          if res<>0 then
                          begin
                            open(out,8,konsol_navn,0);
                            if j<>0 then
                            begin
                              i:= 1;
                              fejlreaktion(4,j,string ia.laf(increase(i)),1);
                            end;
                          end
                          else res:= 3;
                          setposition(z_io,0,0);
                          skriv_kvittering(z_io,0,-1,res);
                        end;
                      end;<*case d.op_ref.opkode -79*>
                    end;<*case 2*>
                    begin
    \f

    message procedure io_komm side 8 - 810424/hko;
    
                      <* 3: vogntabel,linienr/-,busnr*>
    
                      d.op_ref.retur:= cs_io_komm;
                      tofrom(d.op_ref.data,ia,10);
                      indeks:= op_ref;
                      signal_ch(cs_vt,op_ref,gen_optype or io_optype);
                      wait_ch(cs_io_komm,
                              op_ref,
                              io_optype,
                              -1<*timeout*>);
    <*+2*>            if testbit2 and overvåget then
                      disable begin
                        skriv_io_komm(out,0);
                        write(out,"nl",1,<:io operation retur fra vt:>);
                        skriv_op(out,op_ref);
                      end;
    <*-2*>
    <*+4*>            if indeks <> op_ref then
                        fejlreaktion(11<*fremmed post*>,op_ref,<:io_kommando:>,0);
    <*-4*>
    
                      i:=d.op_ref.resultat;
                      if i<1 or i>3 then
                      begin
    <*V*>               setposition(z_io,0,0);
                        if sluttegn<>'nl' then outchar(z_io,'nl');
                        skriv_kvittering(z_io,op_ref,-1,d.op_ref.resultat);
                      end
                      else
                      begin
    \f

    message procedure io_komm side 9 - 820301/hko,cl;
    
                        integer antal,filref;
    
                        antal:= d.op_ref.data(6);
                        fil_ref:= d.op_ref.data(7);
                        pos:= 0;
    <*V*>               setposition(zio,0,0);
                        if sluttegn <> 'nl' then outchar(z_io,'nl');
                        for pos:= pos +1 while pos <= antal do
                        begin
                          integer bogst,løb;
    
                          disable i:= læsfil(fil_ref,pos,j);
                          if i <> 0 then
                            fejlreaktion(5<*læs_fel*>,i,<:io komm., vo,l/vo,b:>,0);
                          vogn:= fil(j,1) shift (-24) extract 24;
                          løb:= fil(j,1) extract 24;
                          if d.op_ref.opkode=9 then
                            begin i:=vogn; vogn:=løb; løb:=i; end;
                          ll:= løb shift(-12) extract 10;
                          bogst:= løb shift(-7) extract 5;
                          if bogst > 0 then bogst:=  bogst+'A'-1;
                          løb:= løb extract 7;
                          vogn:= vogn extract 14;
                          i:= d.op_ref.opkode -8;
                          for i:= i,i +1 do
                          begin
                            j:= (i+1) extract 1;
                            case j+1 of
                            begin
                              write(zio,"sp",if bogst=0 then 1 else 0,<<ddd>,ll,
                                  false add bogst,1,"/",1,true,3,<<d>,løb);
                              write(zio,<<dddd>,vogn,"sp",1);
                            end;
                          end;
                          if pos mod 5 = 0 then
                          begin
                            outchar(zio,'nl');
    <*V*>                   setposition(zio,0,0);
                          end
                          else write(zio,"sp",3);
                        end;
                        write(zio,"*",1);
    \f

    message procedure io_komm side 9a - 810505/hko;
    
                        d.op_ref.opkode:=104;<*slet fil*>
                        d.op_ref.data(4):=filref;
                        indeks:=op_ref;
                        signal_ch(cs_slet_fil,op_ref,genoptype or iooptype);
    <*V*>               wait_ch(cs_io_komm,op_ref,io_optype,-1);
    
    <*+2*>              if testbit2 and overvåget then
                        disable begin
                          skriv_io_komm(out,0);
                          write(out,"nl",1,<:io operation retur fra sletfil:>);
                          skriv_op(out,op_ref);
                        end;
    <*-2*>
    
    <*+4*>              if op_ref<>indeks then
                          fejlreaktion(11<*fr.post*>,op_ref,<:io-komm, sletfil:>,0);
    <*-4*>
                        if d.op_ref.data(9)<>0 then
                          fejlreaktion(3<*prg.fejl*>,d.op_ref.data(9),
                               <:io-komm, sletfil:>,1);
                      end;
                    end;
    
                    begin
    \f

    message procedure io_komm side 10 - 820301/hko;
    
                      <* 4 indsæt/udtag/flyt bus i vogntabel, slet vogntabel *>
    
                      vogn:=ia(1);
                      ll:=ia(2);
                      omr:= if kode=11 or kode=19 then ia(3) else
                            if kode=12            then ia(2) else 0;
                      if kode=19 and omr<=0 then
                      begin
                        if omr=-1 then omr:= 0
                        else omr:= 14 shift 20 + 3; <*OMR TCT*>
                      end;
    <*V*>             wait_ch(cs_vt_adgang,
                              vt_op,
                              gen_optype,
                              -1<*timeout sek*>);
                      start_operation(vtop,101,cs_io_komm,
                                      kode);
                      d.vt_op.data(1):=vogn;
                      d.vt_op.data(2):=ll;
                      d.vt_op.data(if kode=19 then 3 else 4):= omr;
                      indeks:= vt_op;
                      signal_ch(cs_vt,
                                vt_op,
                                gen_optype or io_optype);
    
    <*V*>             wait_ch(cs_io_komm,
                              vt_op,
                              io_optype,
                              -1<*timeout sek*>);
    <*+2*>            if testbit2 and overvåget then
                      disable begin
                        skriv_io_komm(out,0);
                        write(out,"nl",1,
                              <:iooperation retur fra vt:>);
                        skriv_op(out,vt_op);
                      end;
    <*-2*>
    <*+4*>            if vt_op<>indeks then
                        fejl_reaktion(11<*fremmede op*>,op_ref,
                                      <:io-kommando:>,0);
    <*-4*>
    <*V*>             setposition(z_io,0,0);
                      if sluttegn<>'nl' then outchar(z_io,'nl');
                      skriv_kvittering(z_io,if d.vt_op.resultat = 11 or
                        d.vt_op.resultat = 12 then d.vt_op.data(3)
                        else vt_op,-1,d.vt_op.resultat);
                      d.vt_op.optype:= genoptype or vt_optype;
                      disable afslut_operation(vt_op,cs_vt_adgang);
                    end;
    
                    begin
    \f

    message procedure io_komm side 11 - 810428/hko;
    
                      <* 5 autofil-skift
                           gruppe,slet
                           spring  (igangsæt)
                           spring,annuler
                           spring,reserve     *>
    
                      tofrom(d.op_ref.data,ia,8);
                      d.op_ref.retur:=cs_io_komm;
                      indeks:=op_ref;
                      signal_ch(cs_vt,op_ref,gen_optype or io_optype);
    <*V*>             wait_ch(cs_io_komm,
                              op_ref,
                              io_optype,
                              -1<*timeout*>);
    <*+2*>            if testbit2 and overvåget then
                      disable begin
                        skriv_io_komm(out,0);
                        write(out,"nl",1,<:io operation retur fra vt:>);
                        skriv_op(out,op_ref);
                      end;
    <*-2*>
    <*+4*>            if indeks<>op_ref then
                        fejlreaktion(11<*fremmed post*>,op_ref,
                                     <:io-kommando(autofil):>,0);
    <*-4*>
    
    <*V*>             setposition(z_io,0,0);
                      if sluttegn<>'nl' then outchar(z_io,'nl');
                      skriv_kvittering(z_io,if (d.op_ref.resultat=11 or
                          d.op_ref.resultat=12) and kode=34 <*SP,R*> then
                          d.op_ref.data(4) else op_ref,-1,d.op_ref.resultat);
                    end;
    
                    begin
    \f

    message procedure io_komm side 12 - 820301/hko/cl;
    
                      <* 6 gruppedefinition *>
    
                      tofrom(d.op_ref.data,ia,indeks*2);
    <*V*>             wait_ch(cs_io_fil,vt_op,true,-1<*timeout*>);
                      start_operation(vt_op,101,cs_io_komm,
                                      101<*opret fil*>);
                      d.vt_op.data(1):=256;<*postantal*>
                      d.vt_op.data(2):=1;  <*postlængde*>
                      d.vt_op.data(3):=1;  <*segmentantal*>
                      d.vt_op.data(4):=
                              2 shift 10;  <*spool fil*>
                      signal_ch(cs_opret_fil,vt_op,io_optype);
                      pos:=vt_op;<*variabel lånes*>
    <*V*>             wait_ch(cs_io_komm,vt_op,io_optype,-1<*timeout*>);
    <*+4*>            if vt_op<>pos then
                        fejlreaktion(11<*fremmed post*>,vt_op,<:gruppedef:>,0);
                      if d.vt_op.data(9)<>0 then
                        fejlreaktion(13<*opret-fil*>,d.vt_op.data(9),
                          <:io-kommando(gruppedefinition):>,0);
    <*-4*>
                      iaf:=0;
                      for i:=1 step 1 until indeks-1 do
                      begin
                        disable k:=modif_fil(d.vt_op.data(4),i,j);
                        if k<>0 then
                          fejlreaktion(7<*modif-fil*>,k,
                            <:io kommando(gruppe-def):>,0);
                        fil(j).iaf(1):=d.op_ref.data(i+1);
                      end;
                      while sep = ',' do
                      begin
                        wait(bs_fortsæt_adgang);
                        pos:= 1; j:= 0;
                        while læs_store(z_io,i) < 8 do
                        begin
                          skrivtegn(fortsæt,pos,i);
                          if i = '?' or i = 'esc' then j:= 1; <* skip kommando *>
                        end;
                        skrivtegn(fortsæt,pos,'em');
                        afsluttext(fortsæt,pos);
                        sluttegn:= i;
                        if j<>0 then
                        begin
                          setposition(z_io,0,0);
                          if sluttegn <> 'nl' then outchar(z_io,'nl');
                          skriv_kvittering(zio,opref,-1,53);<*annulleret*>
                          goto gr_ann;
                        end;
    \f

    message procedure io_komm side 13 - 810512/hko/cl;
    
                        disable begin
                        integer array værdi(1:4);
                        integer a_pos,res;
                          pos:= 0;
                          repeat
                            apos:= pos;
                            læs_paramsæt(fortsæt,a_pos,0,værdi,sep,res);
                            if res >= 0 then
                            begin
                              if res=0 and (sep=',' or indeks>2) then <*ok*>
                              else if res=0 then res:= -25 <*parameter mangler*>
                              else if res=2 and (værdi(1)<1 or værdi(1)>9999) then
                                      res:= -7 <*busnr ulovligt*>
                              else if res=2 or res=6 then
                              begin
                                k:=modiffil(d.vt_op.data(4),indeks,j);
                                if k<>0 then fejlreaktion(7<*modiffil*>,k,
                                   <:io kommando(gruppe-def):>,0);
                                iaf:= 0;
                                fil(j).iaf(1):= værdi(1) +
                                  (if res=6 then 1 shift 22 else 0);
                                indeks:= indeks+1;
                                if sep = ',' then res:= 0;
                              end
                              else res:= -27; <*parametertype*>
                            end;
                            if res>0 then pos:= a_pos;
                          until sep<>'sp' or res<=0;
    
                          if res<0 then
                          begin
                            d.op_ref.resultat:= -res;
                            i:=1;
                            hægt_tekst(d.op_ref.data,i,fortsæt,1);
                            afsluttext(d.op_ref.data,i);
                          end;
                        end;
    \f

    message procedure io_komm side 13a - 810512/hko/cl;
    
                        if d.op_ref.resultat > 3 then
                        begin
                          setposition(z_io,0,0);
                          if sluttegn <> 'nl' then outchar(z_io,'nl');
                          skriv_kvittering(z_io,op_ref,pos,d.opref.resultat);
                          goto gr_ann;
                        end;
                        signalbin(bs_fortsæt_adgang);
                      end while sep = ',';
                      d.op_ref.data(2):= d.vt_op.data(1):=indeks-1;
                      k:= sætfildim(d.vt_op.data);
                      if k<>0 then fejlreaktion(9,k,<:io kommando(gruppe-def):>,0);
                      d.op_ref.data(3):= d.vt_op.data(4); <*filref*>
                      signalch(cs_io_fil,vt_op,io_optype or gen_optype);
                      d.op_ref.retur:=cs_io_komm;
                      pos:=op_ref;
                      signal_ch(cs_vt,op_ref,gen_optype or io_optype);
    <*V*>             wait_ch(cs_io_komm,op_ref,io_optype,-1<*timeout*>);
    <*+4*>            if pos<>op_ref then
                        fejlreaktion(11<*fremmed post*>,op_ref,
                          <:io kommando(gruppedef retur fra vt):>,0);
    <*-4*>
    
    <*V*>             setposition(z_io,0,0);
                      if sluttegn<>'nl' then outchar(z_io,'nl');
                      skriv_kvittering(z_io,op_ref,-1,d.op_ref.resultat);
    
                      if false then
                      begin
              gr_ann:   signalch(cs_slet_fil,vt_op,io_optype);
                        waitch(cs_io_komm,vt_op,io_optype,-1);
                        signalch(cs_io_fil,vt_op,io_optype or vt_optype);
                      end;
                        
                    end;
    
                    begin
    \f

    message procedure io_komm side 14 - 810525/hko/cl;
    
                      <* 7 gruppe(-oversigts-)rapport *>
    
                      d.op_ref.retur:=cs_io_komm;
                      d.op_ref.data(1):=ia(1);
                      indeks:=op_ref;
                      signal_ch(cs_vt,op_ref,gen_optype or io_optype);
    <*V*>             wait_ch(cs_io_komm,op_ref,io_optype,-1<*timeout*>);
    
    <*+4*>            if op_ref<>indeks then
                        fejlreaktion(11<*fremmed post*>,op_ref,
                          <:io-kommando(gruppe-rapport):>,0);
    <*-4*>
    
    <*V*>             setposition(z_io,0,0);
                      if sluttegn <> 'nl' then outchar(z_io,'nl');
                      if d.op_ref.resultat<>3 then
                      begin
                        skriv_kvittering(z_io,op_ref,-1,d.op_ref.resultat);
                      end
                      else
                      begin
                        integer bogst,løb;
    
                        if kode = 27 then <* gruppe,vis *>
                        begin
    <*V*>                 write(z_io,"nl",1,"-",5,"sp",2,<:gruppe: :>,
                                "G",1,<<z>,d.op_ref.data(1) extract 7,
                                "sp",2,"-",5,"nl",1);
    \f

    message procedure io_komm side 15 - 820301/hko;
    
                          for pos:=1 step 1 until d.op_ref.data(2) do
                          begin
                            disable i:=læsfil(d.op_ref.data(3),pos,j);
                            if i<>0 then
                              fejlreaktion(5<*læsfil*>,i,
                                <:io_kommando(gruppe,vis):>,0);
                            iaf:=0;
                            vogn:=fil(j).iaf(1);
                            if vogn shift(-22) =0 then
                              write(z_io,<<ddddddd>,vogn extract 14)
                            else
                            begin
                              løb:=vogn extract 7;
                              bogst:=vogn shift(-7) extract 5;
                              if bogst>0 then bogst:=bogst+'A'-1;
                              ll:=vogn shift(-12) extract 10;
                              write(z_io,"sp",if bogst=0 then 1 else 0,<<ddd>,ll,
                                    false add bogst,1,"/",1,true,3,<<d>,løb);
                            end;
                            if pos mod 8 =0 then outchar(z_io,'nl')
                            else write(z_io,"sp",2);
                          end;
                          write(z_io,"*",1);
    \f

    message procedure io_komm side 16 - 810512/hko/cl;
    
                        end
                        else if kode=28 then <* gruppe,oversigt *>
                        begin
                          write(z_io,"nl",1,"-",5,"sp",2,<:gruppe oversigt:>,
                                "sp",2,"-",5,"nl",2);
                          for pos:=1 step 1 until d.op_ref.data(1) do
                          begin
                            disable i:=læsfil(d.op_ref.data(2),pos,j);
                            if i<>0 then 
                              fejlreaktion(5<*læsfil*>,i,
                                <:io-kommando(gruppe-oversigt):>,0);
                            iaf:=0;
                            ll:=fil(j).iaf(1);
                            write(z_io,"G",1,<<z>,true,3,ll extract 7);
                            if pos mod 10 =0 then outchar(z_io,'nl')
                            else write(z_io,"sp",3);
                          end;
                          write(z_io,"*",1);
                        end;
                        <* slet fil *>
                        d.op_ref.opkode:= 104;
                        d.op_ref.data(4):= d.op_ref.data(if kode=28 then 2 else 3);
                        signalch(cs_slet_fil,op_ref,gen_optype or io_optype);
                        waitch(cs_io_komm,op_ref,io_optype or gen_optype,-1);
                      end; <* resultat=3 *>
    
                    end;
    
                    begin
    \f

    message procedure io_komm side 17 - 810525/cl;
    
                      <* 8 spring(-oversigts-)rapport *>
    
                      d.op_ref.retur:=cs_io_komm;
                      tofrom(d.op_ref.data,ia,4);
                      indeks:=op_ref;
                      signal_ch(cs_vt,op_ref,gen_optype or io_optype);
    <*V*>             wait_ch(cs_io_komm,op_ref,io_optype,-1<*timeout*>);
    
    <*+4*>            if op_ref<>indeks then
                        fejlreaktion(11<*fremmed post*>,op_ref,
                          <:io-kommando(spring-rapport):>,0);
    <*-4*>
    
    <*V*>             setposition(z_io,0,0);
                      if sluttegn <> 'nl' then outchar(z_io,'nl');
                      if d.op_ref.resultat<>3 then
                      begin
                        skriv_kvittering(z_io,op_ref,-1,d.op_ref.resultat);
                      end
                      else
                      begin
                        boolean p_skrevet;
                        integer bogst,løb;
    
                        if kode = 32 then <* spring,vis *>
                        begin
                          ll:= d.op_ref.data(1) shift (-5) extract 10;
                          bogst:= d.op_ref.data(1) extract 5;
                          if bogst<>0 then bogst:= bogst + 'A' - 1;
    <*V*>                 write(z_io,"nl",1,"-",5,"sp",2,<:spring: :>,
                                <<d>,ll,false add bogst,(bogst<>0) extract 1,
                                <:.:>,string (extend d.op_ref.data(2) shift 24));
                          raf:= data+8;
                          if d.op_ref.raf(1)<>0.0 then
                            write(z_io,<:,  startet :>,<<zddddd>,round
                              systime(4,d.op_ref.raf(1),r),<:.:>,round r)
                          else
                            write(z_io,<:, ikke startet:>);
                          write(z_io,"sp",2,"-",5,"nl",1);
    \f

    message procedure io_komm side 18 - 810518/cl;
    
                          p_skrevet:= false;
                          for pos:=1 step 1 until d.op_ref.data(3) do
                          begin
                            disable i:=læsfil(d.op_ref.data(4),pos,j);
                            if i<>0 then
                              fejlreaktion(5<*læsfil*>,i,
                                <:io_kommando(spring,vis):>,0);
                            iaf:=0;
                            i:= fil(j).iaf(1);
                            if i < 0 and -, p_skrevet then
                            begin
                              outchar(z_io,'('); p_skrevet:= true;
                            end;
                            if i > 0 and p_skrevet then
                            begin
                              outchar(z_io,')'); p_skrevet:= false;
                            end;
                            if pos mod 2 = 0 then
                              write(z_io,<< dd>,abs i,<:.:>)
                            else
                              write(z_io,true,3,<<d>,abs i);
                            if pos mod 21 = 0 then outchar(z_io,'nl');
                          end;
                          write(z_io,"*",1);
    \f

    message procedure io_komm side 19 - 810525/cl;
    
                        end
                        else if kode=33 then <* spring,oversigt *>
                        begin
                          write(z_io,"nl",1,"-",5,"sp",2,<:spring oversigt:>,
                                "sp",2,"-",5,"nl",2);
                          for pos:=1 step 1 until d.op_ref.data(1) do
                          begin
                            disable i:=læsfil(d.op_ref.data(2),pos,j);
                            if i<>0 then 
                              fejlreaktion(5<*læsfil*>,i,
                                <:io-kommando(spring-oversigt):>,0);
                            iaf:=0;
                            ll:=fil(j).iaf(1) shift (-5) extract 10;
                            bogst:=fil(j).iaf(1) extract 5;
                            if bogst<>0 then bogst:=bogst + 'A' - 1;
                            write(z_io,"sp",(bogst=0) extract 1 + 1,<<ddd>,ll,
                              false add bogst,(bogst<>0) extract 1,<:.:>,true,4,
                              string (extend fil(j).iaf(2) shift 24));
                            if fil(j,2)<>0.0 then
                              write(z_io,<:startet :>,<<zddddd>,
                                round systime(4,fil(j,2),r),<:.:>,round r);
                            outchar(z_io,'nl');
                          end;
                          write(z_io,"*",1);
                        end;
                        <* slet fil *>
                        d.op_ref.opkode:= 104;
                        if kode=33 then d.op_ref.data(4):= d.op_ref.data(2);
                        signalch(cs_slet_fil,op_ref,gen_optype or io_optype);
                        waitch(cs_io_komm,op_ref,io_optype or gen_optype,-1);
                      end; <* resultat=3 *>
    
                    end;
    
                    begin
    \f

    message procedure io_komm side 20 - 820302/hko;
    
                      <* 9 fordeling af linier/områder på operatører *>
    
                      d.op_ref.retur:=cs_io_komm;
                      disable
                      if kode=5 then
                      begin
                        integer array io_linietabel(1:max_linienr//3+1);
    
                        for ref:= 0 step 512 until (max_linienr//768*512) do
                        begin
                          i:= læs_fil(1035,ref//512+1,j);
                          if i <> 0 then
                            fejlreaktion(5,i,<:liniefordelingstabel:>,0);
                          tofrom(io_linietabel.ref,fil(j),
                          if (((max_linienr+1 - (ref//2*3))+2)//3*2) > 512 then 512
                          else ((max_linienr+1 - (ref//2*3))+2)//3*2);
                        end;  
                        ref:=0;
                        operatør:=ia(1);
                        for j:=2 step 1 until indeks do
                        begin
                          ll:=ia(j);
                          if ll<>0 then
                            skrivtegn(io_linietabel,abs(ll)+1,
                                if ll>0 then operatør else 0);
                        end;
                        for ref:= 0 step 512 until (max_linienr//768*512) do
                        begin
                          i:= skriv_fil(1035,ref//512+1,j);
                          if i <> 0 then
                            fejlreaktion(6,i,<:liniefordelingstabel:>,0);
                          tofrom(fil(j),io_linietabel.ref,
                             if (((max_linienr+1 - (ref//2*3))+2)//3*2) > 512
                             then 512 else ((max_linienr+1 - (ref//2*3))+2)//3*2
                          );
                        end;  
                        ref:=0;
                      end
                      else
                      begin
                        modiffil(1034,1,i);
                        ref:=0;
                        operatør:=ia(1);
                        for j:=2 step 1 until indeks do
                        begin
                          ll:=ia(j);
                          fil(i).ref(ll):= if ll>0 then operatør else 0;
                        end;
                      end;
                      indeks:=op_ref;
                      signal_ch(cs_rad,op_ref,gen_optype or io_optype);
    <*V*>             wait_ch(cs_io_komm,op_ref,io_optype,-1);
    
    <*+4*>            if op_ref<>indeks then
                        fejlreaktion(11<*fr.post*>,op_ref,
                          <:io-komm,liniefordeling retur fra rad:>,0);
    <*-4*>
    
    <*V*>             setposition(z_io,0,0);
                      if sluttegn<>'nl' then outchar(z_io,'nl');
                      skriv_kvittering(z_io,op_ref,-1,d.op_ref.resultat);
    
                    end;
    
                    begin
    \f

    message procedure io_komm side 21 - 820301/cl;
    
                      <* 10 springdefinition *>
    
                      tofrom(d.op_ref.data,ia,indeks*2);
    <*V*>             wait_ch(cs_io_fil,vt_op,true,-1<*timeout*>);
                      start_operation(vt_op,101,cs_io_komm,
                                      101<*opret fil*>);
                      d.vt_op.data(1):=128;<*postantal*>
                      d.vt_op.data(2):=2;  <*postlængde*>
                      d.vt_op.data(3):=1;  <*segmentantal*>
                      d.vt_op.data(4):=
                              2 shift 10;  <*spool fil*>
                      signal_ch(cs_opret_fil,vt_op,io_optype);
                      pos:=vt_op;<*variabel lånes*>
    <*V*>             wait_ch(cs_io_komm,vt_op,io_optype,-1<*timeout*>);
    <*+4*>            if vt_op<>pos then
                        fejlreaktion(11<*fremmed post*>,vt_op,<:springdef:>,0);
                      if d.vt_op.data(9)<>0 then
                        fejlreaktion(13<*opret-fil*>,d.vt_op.data(9),
                          <:io-kommando(springdefinition):>,0);
    <*-4*>
                      iaf:=0;
                      for i:=1 step 1 until indeks-2 do
                      begin
                        disable k:=modif_fil(d.vt_op.data(4),i,j);
                        if k<>0 then
                          fejlreaktion(7<*modif-fil*>,k,
                            <:io kommando(spring-def):>,0);
                        fil(j).iaf(1):=d.op_ref.data(i+2);
                      end;
                      while sep = ',' do
                      begin
                        wait(bs_fortsæt_adgang);
                        pos:= 1; j:= 0;
                        while læs_store(z_io,i) < 8 do
                        begin
                          skrivtegn(fortsæt,pos,i);
                          if i = '?' or i = 'esc' then j:= 1; <* skip kommando *>
                        end;
                        skrivtegn(fortsæt,pos,'em');
                        afsluttext(fortsæt,pos);
                        sluttegn:= i;
                        if j<>0 then
                        begin
                          setposition(z_io,0,0);
                          if sluttegn <> 'nl' then outchar(z_io,'nl');
                          skriv_kvittering(z_io,opref,-1,53);<*annulleret*>
                          goto sp_ann;
                        end;
    \f

    message procedure io_komm side 22 - 810519/cl;
    
                        disable begin
                        integer array værdi(1:4);
                        integer a_pos,res;
                          pos:= 0;
                          repeat
                            apos:= pos;
                            læs_paramsæt(fortsæt,a_pos,0,værdi,sep,res);
                            if res >= 0 then
                            begin
                              if res=0 and (sep=',' or indeks>2) then <*ok*>
                              else if res=0 then res:= -25 <*parameter mangler*>
                              else if res=10 and (værdi(1)<1 or værdi(1)>99) then
                                  res:= -44 <*intervalstørrelse ulovlig*>
                              else if res=10 and (værdi(2)<1 or værdi(2)>99) then
                                  res:= -6  <*løbnr ulovligt*>
                              else if res=10 then
                              begin
                                k:=modiffil(d.vt_op.data(4),indeks-1,j);
                                if k<>0 then fejlreaktion(7<*modiffil*>,k,
                                   <:io kommando(spring-def):>,0);
                                iaf:= 0;
                                fil(j).iaf(1):= værdi(1) shift 12 + værdi(2);
                                indeks:= indeks+1;
                                if sep = ',' then res:= 0;
                              end
                              else res:= -27; <*parametertype*>
                            end;
                            if res>0 then pos:= a_pos;
                          until sep<>'sp' or res<=0;
    
                          if res<0 then
                          begin
                            d.op_ref.resultat:= -res;
                            i:=1;
                            hægt_tekst(d.op_ref.data,i,fortsæt,1);
                            afsluttext(d.op_ref.data,i);
                          end;
                        end;
    \f

    message procedure io_komm side 23 - 810519/cl;
    
                        if d.op_ref.resultat > 3 then
                        begin
                          setposition(z_io,0,0);
                          if sluttegn <> 'nl' then outchar(z_io,'nl');
                          skriv_kvittering(z_io,op_ref,pos,d.opref.resultat);
                          goto sp_ann;
                        end;
                        signalbin(bs_fortsæt_adgang);
                      end while sep = ',';
                      d.vt_op.data(1):= indeks-2;
                      k:= sætfildim(d.vt_op.data);
                      if k<>0 then fejlreaktion(9,k,<:io kommando(spring-def):>,0);
                      d.op_ref.data(3):= d.vt_op.data(4); <*filref*>
                      signalch(cs_io_fil,vt_op,io_optype or gen_optype);
                      d.op_ref.retur:=cs_io_komm;
                      pos:=op_ref;
                      signal_ch(cs_vt,op_ref,gen_optype or io_optype);
    <*V*>             wait_ch(cs_io_komm,op_ref,io_optype,-1<*timeout*>);
    <*+4*>            if pos<>op_ref then
                        fejlreaktion(11<*fremmed post*>,op_ref,
                          <:io kommando(springdef retur fra vt):>,0);
    <*-4*>
    
    <*V*>             setposition(z_io,0,0);
                      if sluttegn<>'nl' then outchar(z_io,'nl');
                      skriv_kvittering(z_io,op_ref,-1,d.op_ref.resultat);
    
                      if false then
                      begin
              sp_ann:   signalch(cs_slet_fil,vt_op,io_optype);
                        waitch(cs_io_komm,vt_op,io_optype,-1);
                        signalch(cs_io_fil,vt_op,io_optype or vt_optype);
                        signalbin(bs_fortsæt_adgang);
                      end;
                        
                    end;
                    begin
                      integer i,j,k,opr,lin,max_lin;
                      boolean o_ud, t_ud;
    \f

    message procedure io_komm side 23a - 820301/cl;
    
                      <* 11 fordelingsrapport *>
    
    <*V*>             setposition(z_io,0,0);
                      if sluttegn <> 'nl' then outchar(z_io,'nl');
    
                      max_lin:= max_linienr;
                      for opr:= 1 step 1 until max_antal_operatører, 0 do
                      begin
                        o_ud:= t_ud:= false;
                        k:= 0;
    
                        if opr<>0 then
                        begin
                          j:= k:= 0;
                          for lin:= 1 step 1 until max_lin do
                          begin
                            læs_tegn(radio_linietabel,lin+1,i);
                            if i<>0 then j:= lin;
                            if opr=i and opr<>0 then
                            begin
                              if -, o_ud then
                              begin
                                o_ud:= true;
                                if opr<>0 then
                                  write(z_io,"nl",1,<:operatør:>,<< dd>,opr,
                                    "sp",2,string bpl_navn(opr))
                                else
                                  write(z_io,"nl",1,<:ikke fordelte:>);
                              end;
                              if -, t_ud then
                              begin
                                write(z_io,<:<'nl'>    linier: :>);
                                t_ud:= true;
                              end;
                              k:=k+1;
                              if k>1 and k mod 10 = 1 then
                                write(z_io,"nl",1,"sp",13);
                              write(z_io,<<ddd >,lin);
                            end;
                            if lin=max_lin then max_lin:= j;
                          end;
                        end;
    
                        k:= 0; t_ud:= false;
                        for i:= 1 step 1 until max_antal_områder do
                        begin
                          if radio_områdetabel(i)= opr then
                          begin
                            if -, o_ud then
                            begin
                              o_ud:= true;
                              if opr<>0 then
                                write(z_io,"nl",1,<:operatør:>,<< dd>,opr,
                                  "sp",2,string bpl_navn(opr))
                              else
                                write(z_io,"nl",1,<:ikke fordelte:>);
                            end;
                            if -, t_ud then
                            begin
                              write(z_io,<:<'nl'>    områder: :>);
                              t_ud:= true;
                            end;
                            k:= k+1;
                            if k>1 and k mod 10 = 1 then
                              write(z_io,"nl",1,"sp",13);
                            write(z_io,true,4,string område_navn(i));
                          end;
                        end;
                        if o_ud then write(z_io,"nl",1);
                      end;
                      write(z_io,"*",1);
                    end;
    
                    begin
                      integer omr,typ,sum;
                      integer array ialt(1:5);
                      real r;
    \f

    message procedure io_komm side 24 - 810501/hko;
    
                      <* 12 vis/nulstil opkaldstællere *>
    
    
                      if kode=76 and indeks=1 then
                      begin <* TÆ,N <tid> *>
                        if ia(1)<(-1) or 2400<ia(1) then
                        begin
                          setposition(z_io,0,0);
                          if sluttegn<>'nl' then outchar(z_io,'nl');
                          skriv_kvittering(z_io,opref,-1,64);
                        end
                        else
                        begin
                          if ia(1)=(-1) then nulstil_systællere:= -1
                          else nulstil_systællere:= (ia(1) mod 2400)*100;
                          opdater_tf_systællere;
                          typ:= opref; <* typ lånes til gemmevariabel *>
                          d.opref.retur:= cs_io_komm;
                          signal_ch(cs_io_nulstil,opref,io_optype);
    <*V*>                 wait_ch(cs_io_komm,opref,io_optype,-1);
    <*+4*>                if opref <> typ then
                            fejlreaktion(11<*fremmed post*>,opref,
                              <:io_kommando:>,0);
    <*-4*>
                          setposition(z_io,0,0);
                          if sluttegn<>'nl' then outchar(z_io,'nl');
                          skriv_kvittering(z_io,opref,-1,3);
                        end;
                      end
                      else
                      begin
                        setposition(z_io,0,0);
                        if sluttegn<>'nl' then outchar(z_io,'nl');
                        for typ:= 1 step 1 until 5 do ialt(typ):= 0;
      
                        write(z_io,
                  <:område  udgående  alm.ind  nød ind:>,
                  <: ind-ialt    total   ej forb.  optaget:>,"nl",1);
                        for omr := 1 step 1 until max_antal_områder do
                        begin
                          sum:= 0;
                          write(z_io,true,6,string område_navn(omr),":",1);
                          for typ:= 1 step 1 until 3 do
                          begin
                            write(z_io,<<  ddddddd>,opkalds_tællere((omr-1)*5+typ));
                            sum:= sum + opkalds_tællere((omr-1)*5+typ);
                            ialt(typ):= ialt(typ)+opkalds_tællere((omr-1)*5+typ);
                          end;
                          write(z_io,<<  ddddddd>,
                            sum-opkalds_tællere((omr-1)*5+1),sum,"sp",2);
                          for typ:= 4 step 1 until 5 do
                          begin
                            write(z_io,<<  ddddddd>,opkalds_tællere((omr-1)*5+typ));
                            ialt(typ):= ialt(typ)+opkalds_tællere((omr-1)*5+typ);
                          end;
                          write(z_io,"nl",1);
                        end;
                        sum:= 0;
                        write(z_io,"nl",1,<:ialt  ::>);
                        for typ:= 1 step 1 until 3 do
                        begin
                          write(z_io,<<  ddddddd>,ialt(typ));
                          sum:= sum+ialt(typ);
                        end;
                        write(z_io,<<  ddddddd>,sum-ialt(1),sum,"sp",2,
                          ialt(4), ialt(5), "nl",3);
    
                        for typ:= 1 step 1 until 5 do ialt(typ):= 0;
                        write(z_io,
                          <:oper.   udgående  alm.ind  nød ind:>,
                          <: ind-ialt    total   ej forb.  optaget:>,"nl",1);
                        for omr := 1 step 1 until max_antal_operatører do
                        begin
                          sum:= 0;
                          if bpl_navn(omr)=long<::> then
                            write(z_io,"sp",6-write(z_io,<:op:>,<<d>,omr),":",1)
                          else
                            write(z_io,true,6,string bpl_navn(omr),":",1);
                          for typ:= 1 step 1 until 3 do
                          begin
                            write(z_io,<<  ddddddd>,operatør_tællere((omr-1)*4+typ));
                            sum:= sum + operatør_tællere((omr-1)*5+typ);
                            ialt(typ):= ialt(typ)+operatør_tællere((omr-1)*5+typ);
                          end;
                          write(z_io,<<  ddddddd>,
                            sum-operatør_tællere((omr-1)*5+1),sum,"sp",2);
                          for typ:= 4 step 1 until 5 do
                          begin
                            write(z_io,<<  ddddddd>,operatør_tællere((omr-1)*5+typ));
                            ialt(typ):= ialt(typ)+operatør_tællere((omr-1)*5+typ);
                          end;
                          write(z_io,"nl",1);
                        end;
                        sum:= 0;
                        write(z_io,"nl",1,<:ialt  ::>);
                        for typ:= 1 step 1 until 3 do
                        begin
                          write(z_io,<<  ddddddd>,ialt(typ));
                          sum:= sum+ialt(typ);
                        end;
                        write(z_io,<<  ddddddd>,sum-ialt(1),sum,"sp",2,
                          ialt(4),ialt(5),"nl",2);
    
                        typ:= replacechar(1,':');
                        write(z_io,<:tællere nulstilles :>);
                        if nulstil_systællere=(-1) then
                          write(z_io,<:ikke automatisk:>,"nl",1)
                        else
                          write(z_io,<:automatisk kl. :>,<<zd dd dd>,
                            nulstil_systællere,"nl",1);
                        replacechar(1,'.');
                        write(z_io,<:sidst nulstillet d. :>,<<zd dd dd>,
                          systime(4,systællere_nulstillet,r));
                        replacechar(1,':');
                        write(z_io,<: kl. :>,<<zd dd dd>,r,"nl",1);
                        replacechar(1,typ);
                        write(z_io,"*",1,"nl",1);
                        setposition(z_io,0,0);
      
                        if kode = 76 <* nulstil tællere *> then
                        disable begin
                          for omr:= 1 step 1 until max_antal_områder*5 do
                            opkalds_tællere(omr):= 0;
                          for omr:= 1 step 1 until max_antal_operatører*5 do
                            operatør_tællere(omr):= 0;
                          systime(1,0.0,systællere_nulstillet);
                          opdater_tf_systællere;
                          typ:= replacechar(1,'.');
                          write(z_io,<:!!! tællere nulstillet d. :>,<<zd dd dd>,
                            systime(4,systællere_nulstillet,r));
                          replacechar(1,':');
                          write(z_io,<: kl. :>,<<zd dd dd>,r,"nl",1);
                          replacechar(1,typ);
                          setposition(z_io,0,0);
                        end;
                      end;
                    end;
    
                    begin
    \f

    message procedure io_komm side 25 - 940522/cl;
    
                      <* 13 navngiv betjeningsplads *>
                      boolean incl;
                      long field lf;
    
                      lf:=6;
                      operatør:= ia(1);
                      navn:= ia.lf;
                      incl:= false add (ia(4) extract 8);
    
                      if navn=long<::> then
                      begin
                        <* nedlæg navn - check for i brug *>
                        iaf:= operatør*terminal_beskr_længde;
                        if terminal_tab.iaf.terminal_tilstand shift (-21)<>7 then
                          d.opref.resultat:= 48 <*i brug*>
                        else
                        begin
                          for i:= 65 step 1 until top_bpl_gruppe do
                          begin
                            iaf:= i*op_maske_lgd;
                            if læsbit_ia(bpl_def.iaf,operatør) then
                              d.opref.resultat:= 48<*i brug*>;
                          end;
                        end;
                        if d.opref.resultat <= 3 then
                        begin
                          for i:= 1 step 1 until sidste_bus do
                            if bustabel(i) shift (-14) extract 8 = operatør then
                              d.opref.resultat:= 48<*i brug*>;
                        end;
                      end
                      else
                      begin
                        <* opret/omdøb *>
                        i:= find_bpl(navn);
                        if i<>0 and i<>operatør then 
                          d.opref.resultat:= 48 <*i brug*>;
                      end;
                      if d.opref.resultat<=3 then
                      begin
                        bpl_navn(operatør):= navn;
                        operatør_auto_include(operatør):= incl;
                        k:= modif_fil(tf_bpl_navne,operatør,ll);
                        if k<>0 then
                          fejlreaktion(7,k,<:betjeningsplads,navngiv:>,0);
                        lf:= 4;
                        fil(ll).lf:= navn add (incl extract 8);
                        setposition(fil(ll),0,0);
    
                        <* skriv bplnavne *>
                        disable begin
                          zone z(128,1,stderror);
                          long array field laf;
                          integer array ia(1:10);
    
                          open(z,4,<:bplnavne:>,0);
                          laf:= 0;
                          outrec6(z,512);
                          for i:= 1 step 1 until 127 do
                            z.laf(i):= bpl_navn(i);
                          close(z,true);
                          monitor(42,z,0,ia);
                          ia(6):= systime(7,0,0.0);
                          monitor(44,z,0,ia);
                        end;                        
                        d.opref.resultat:= 3;<*udført*>
                      end;
    
                      setposition(z_io,0,0);
                      if sluttegn<>'nl' then outchar(z_io,'nl');
                      skriv_kvittering(z_io,opref,-1,d.opref.resultat);
                    end;
    
                    begin
    \f

    message procedure io_komm side 26 - 940522/cl;
    
                      <* 14 betjeningsplads - gruppe *>
                      integer ant_i_gruppe;
                      long field lf;
                      integer array maske(1:op_maske_lgd//2);
    
                      lf:= 4; ant_i_gruppe:= 0;
                      tofrom(maske,ingen_operatører,op_maske_lgd);
                      navn:= ia.lf;
                      operatør:= find_bpl(navn);
                      for i:= 3 step 1 until indeks do
                        if sætbit_ia(maske,ia(i),1)=0 then
                          ant_i_gruppe:= ant_i_gruppe+1;
                      if ant_i_gruppe=0 then
                      begin
                        <* slet gruppe *>
                        if operatør<=64 then
                          d.opref.resultat:= (if operatør=0 then 46<*navn ukendt*>
                                                      else 62<*navn ulovligt*>)
                        else
                        begin
                          for i:= 1 step 1 until max_antal_operatører do
                            for j:= 1 step 1 until 3 do
                              if operatør_stop(i,j)=operatør then
                                d.opref.resultat:= 48<*i brug*>;
                        end;
                        navn:= long<::>;
                      end
                      else
                      begin
                        if 1<=operatør and operatør<=64 then
                          d.opref.resultat:= 62<*navn ulovligt*>
                        else
                        if operatør=0 then
                        begin
                          i:=65;
                          while i<=127 and operatør=0 do
                          begin
                            if bpl_navn(i)=long<::> then operatør:=i;
                            i:= i+1;
                          end;
                          if operatør=0 then
                            d.opref.resultat:= 32<*ikke plads*>
                          else if operatør>top_bpl_gruppe then
                            top_bpl_gruppe:= operatør;
                        end;
                      end;
                      if d.opref.resultat<=3 then
                      begin
                        bpl_navn(operatør):= navn;
                        iaf:= operatør*op_maske_lgd;
                        tofrom(bpl_def.iaf,maske,op_maske_lgd);
                        bpl_tilst(operatør,1):= bpl_tilst(operatør,2):= 0;
                        for i:= 1 step 1 until max_antal_operatører do
                        begin
                          if læsbit_ia(maske,i) then
                          begin
                            bpl_tilst(operatør,2):= bpl_tilst(operatør,2)+1;
                            if læsbit_ia(operatør_maske,i) then
                              bpl_tilst(operatør,1):= bpl_tilst(operatør,1)+1;
                          end;
                        end;
                        k:=modif_fil(tf_bplnavne,operatør,ll);
                        if k<>0 then
                          fejlreaktion(7,k,<:btj.plads,gruppenavn:>,0);
                        lf:= 4;
                        fil(ll).lf:= navn;
                        setposition(fil(ll),0,0);
                        iaf:= 0;
                        k:= modif_fil(tf_bpl_def,operatør-64,ll);
                        if k<>0 then
                          fejlreaktion(7,k,<:btj.plads,gruppedef:>,0);
                        for i:= 1 step 1 until op_maske_lgd//2 do
                          fil(ll).iaf(i):= maske(i);
                        fil(ll).iaf(4):= bpl_tilst(operatør,2);
                        setposition(fil(ll),0,0);
                        d.opref.resultat:= 3;
                      end;
    
                      setposition(z_io,0,0);
                      if sluttegn<>'nl' then outchar(z_io,'nl');
                      skriv_kvittering(z_io,opref,-1,d.opref.resultat);
                    end;
    
                    begin
    \f

    message procedure io_komm side 27 - 940522/cl;
    
                      <* 15 vis betjeningspladsdefinitioner *>
    
                      setposition(z_io,0,0);
                      if sluttegn<>'nl' then outchar(z_io,'nl');
                      write(z_io,"nl",1,<:operatørpladser::>,"nl",1);
                      for i:= 1 step 1 until max_antal_operatører do
                      begin
                        write(z_io,<<dd>,i,<:: :>,true,6,string bpl_navn(i),
                          case operatør_auto_include(i) extract 2 + 1 of(
                          <:(--):>,<:(ÅB):>,<:(??):>,<:(ST):>));
                        if i mod 4 = 0 then write(z_io,"nl",1)
                                       else write(z_io,"sp",5);
                      end;
                      if max_antal_operatører mod 4 <> 0 then write(z_io,"nl",1);
                      write(z_io,"nl",1,<:grupper::>,"nl",1);
                      for i:= 65 step 1 until top_bpl_gruppe do
                      begin
                        ll:=0; iaf:= i*op_maske_lgd;
                        if bpl_navn(i)<>long<::> then
                        begin
                          write(z_io,true,6,string bpl_navn(i),":",1);
                          for j:= 1 step 1 until max_antal_operatører do
                          begin
                            if læsbit_ia(bpl_def.iaf,j) then
                            begin
                              if ll mod 8 = 0 and ll<>0 then
                                write(z_io,"nl",1,"sp",7);
                              write(z_io,"sp",2,string bpl_navn(j));
                              ll:=ll+1;
                            end;
                          end;
                          write(z_io,"nl",1);
                        end;
                      end;
                      write(z_io,"*",1);
                    end;
    
                    begin
    \f

    message procedure io_komm side 28 - 940522/cl;
    
                      <* 16 stopniveau,definer *>
    
                      operatør:= ia(1);
                      iaf:= operatør*terminal_beskr_længde;
                      for i:= 1 step 1 until 3 do
                        operatør_stop(operatør,i):= ia(i+1);
                      if -,læsbit_ia(operatørmaske,operatør) then
                      begin
                        tofrom(opkaldsflag,alle_operatører,op_maske_lgd);
                        signal_bin(bs_mobilopkald);
                      end;
                      k:=modif_fil(tf_stoptabel,operatør,ll);
                      if k<>0 then
                        fejlreaktion(7,k,<:stopniveau,definer:>,0);
                      iaf:= 0;
                      for i:= 0 step 1 until 3 do
                        fil(ll).iaf(i+1):= operatør_stop(operatør,i);
                      setposition(fil(ll),0,0);
                      setposition(z_io,0,0);
                      if sluttegn<>'nl' then outchar(z_io,'nl');
                      skriv_kvittering(z_io,0,-1,3);
                    end;
    
                    begin
    \f

    message procedure io_komm side 29 - 940522/cl;
    
                      <* 17 stopniveauer,vis *>
    
                      setposition(z_io,0,0);
                      if sluttegn<>'nl' then outchar(z_io,'nl');
    
                      for operatør:= 1 step 1 until max_antal_operatører do
                      begin
                        iaf:=operatør*terminal_beskr_længde;
                        ll:=0;
                        ll:=write(z_io,<<dd>,operatør,<:: :>,true,6,
                              string bpl_navn(operatør),<:(:>,
                              case terminal_tab.iaf.terminal_tilstand shift (-21)
                              + 1 of (<:AKTIV:>,<:AKTIV:>,<:AKTIV:>,<:PAUSE:>,
                              <:EKSKL:>,<:EKSKL:>,<:EKSKL:>,<:EKSKL:>), <:) :>);
                        for i:= 1 step 1 until 3 do
                          ll:= ll+write(z_io,if i=1 then "sp" else "/",1,
                                  if operatør_stop(operatør,i)=0 then <:ALLE:>
                                  else string bpl_navn(operatør_stop(operatør,i)));
                        if operatør mod 2 = 1 then
                          write(z_io,"sp",40-ll)
                        else
                          write(z_io,"nl",1);
                      end;
                      if max_antal_operatører mod 2 <> 0 then write(z_io,"nl",1);
                      write(z_io,"*",1);
                    end;
    
                    begin
    \f

    message procedure io_komm side 30 - 941007/cl;
    
                      <* 18 alarmlængder *>
    
                      setposition(z_io,0,0);
                      if sluttegn<>'nl' then outchar(z_io,'nl');
    
                      for operatør:= 1 step 1 until max_antal_operatører do
                      begin
                        ll:=0;
                        ll:=write(z_io,<<dd>,operatør,<:: :>,true,6,
                              string bpl_navn(operatør));
                        iaf:=(operatør-1)*opk_alarm_tab_lgd;
                        if opk_alarm.iaf.alarm_lgd < 0 then
                          ll:= ll+write(z_io,<:uendelig:>)
                        else
                          ll:= ll+write(z_io,<<ddddddd>,
                                    opk_alarm.iaf.alarm_lgd,<: sek.:>);
    
                        if operatør mod 2 = 1 then
                          write(z_io,"sp",40-ll)
                        else
                          write(z_io,"nl",1);
                      end;
                      if max_antal_operatører mod 2 <> 0 then write(z_io,"nl",1);
                      write(z_io,"*",1);
                    end;
    
                    begin
                      <* 19 CC *>
                      integer i, c;
    
                      i:= 1;
                      while læstegn(ia,i+0,c)<>0 and
                        i<(op_spool_postlgd-op_spool_text)//2*3
                      do skrivtegn(d.opref.data,i,c);
                      repeat skrivtegn(d.opref.data,i,0) until (i mod 6)=1;
    
                      d.opref.retur:= cs_io_komm;
                      signalch(cs_op,opref,io_optype or gen_optype);
    <*V*>             waitch(cs_io_komm,opref,io_optype,-1);
                                                           
                      setposition(z_io,0,0);
                      if sluttegn<>'nl' then outchar(z_io,'nl');
                      skriv_kvittering(z_io,opref,-1,d.opref.resultat);
                    end;                  
                    
                    begin
                      <* 20: CQF,I CQF,U CQF,V *>
                      integer kode, res, i, j;
                      integer array field iaf, iaf1;
                      long field navn;
    
                      kode:= d.opref.opkode extract 12;
                      navn:= 6; res:= 0;
                      if kode=90 <*CQF,I*> then
                      begin
                        if søg_omr_bus(ia(1),0,0,0,0,0) < 0 then
                          res:= 10 <*busnr ukendt*>
                        else
                        begin
                          j:= -1;
                          for i:= 1 step 1 until max_cqf do
                          begin
                            iaf:= (i-1)*cqf_lgd;
                            if ia(1) = cqf_tabel.iaf.cqf_bus or
                               ia.navn = cqf_tabel.iaf.cqf_id
                            then res:= 48; <*i brug*>
                            if j<0 and cqf_tabel.iaf.cqf_bus=0 then j:= i;
                          end;
                          if res=0 and j<0 then res:= 32; <*ingen fri plads*>
                          if res=0 then
                          begin
                            iaf:= (j-1)*cqf_lgd;
                            cqf_tabel.iaf.cqf_bus:= ia(1);
                            cqf_tabel.iaf.cqf_fejl:= 0;
                            cqf_tabel.iaf.cqf_id:= ia.navn;
                            cqf_tabel.iaf.cqf_ok_tid:= real <::>;
                            cqf_tabel.iaf.cqf_næste_tid:= d.opref.tid + 15*60.0;
                            res:= 3;
                          end;
                        end;
                        setposition(z_io,0,0);
                        if sluttegn<>'nl' then outchar(z_io,'nl');
                        skriv_kvittering(z_io,opref,-1,res);
                      end
                      else
                      if kode=91 <*CQF,U*> then
                      begin
                        j:= -1;
                        for i:= 1 step 1 until max_cqf do
                        begin
                          iaf:= (i-1)*cqf_lgd;
                          if ia(1) = cqf_tabel.iaf.cqf_bus then j:= i;
                        end;
                        if j>=0 then
                        begin
                          iaf:= (j-1)*cqf_lgd;
                          for i:= 1 step 1 until cqf_lgd//2 do
                            cqf_tabel.iaf(i):= 0;
                          res:= 3;
                        end
                        else res:= 13; <*bus ikke indsat*>
                        setposition(z_io,0,0);
                        if sluttegn<>'nl' then outchar(z_io,'nl');
                        skriv_kvittering(z_io,opref,-1,res);
                      end
                      else
                      begin
                        setposition(z_io,0,0);
                        skriv_cqf_tabel(z_io,false);
                        outchar(z_io,'*');
                        setposition(z_io,0,0);
                      end;               
    
                      if kode=90 or kode=91 then
                      begin
                        j:= skrivfil(1033,1,i);
                        if j<>0 then
                          fejlreaktion(6,j,<:CQF-test cqf-tabel:>,1);
                        for k:= 1 step 1 until max_cqf do
                        begin
                          iaf1:= (k-1)*cqf_lgd;
                          iaf := (k-1)*cqf_id;
                          tofrom(fil(i).iaf,cqf_tabel.iaf1,cqf_id);
                        end;
                        op_cqf_tab_ændret:= true;
                      end;
                    end;<*CQF*>
                          
    
                    begin
    \f

    message procedure io_komm side xx - 940522/cl;
    
    
    
    <*+3*>            fejl_reaktion(3<*programfejl*>,j,<:case 'opkode':>,2);
    <*-3*>
                    end
                  end;<*case j *>
                end <* j > 0 *>
                else
                begin
    <*V*>         setposition(z_io,0,0);
                  if sluttegn<>'nl' then outchar(z_io,'nl');
                  skriv_kvittering(z_io,op_ref,-1,
                                   45 <* ikke implementeret *>);
                end;
              end;<* godkendt *>
    
    <*V*>     setposition(z_io,0,0);
              signal_bin(bs_zio_adgang);
              d.op_ref.retur:=cs_att_pulje;
              disable afslut_kommando(op_ref);
            end; <* indlæs kommando *>
    
            begin
    \f

    message procedure io_komm side xx+1 - 810428/hko;
    
              <* 2: aktiver efter stop *>
              terminal_tab.ref.terminal_tilstand:= 0 shift 21 +
                terminal_tab.ref.terminal_tilstand extract 21;
              afslut_operation(op_ref,-1);
              signal_bin(bs_zio_adgang);
            end;
    
    <*+3*>  fejl_reaktion(3<*programfejl *>,aktion,<:case aktion:>,2)
    <*-3*>
          end; <* case aktion+6 *>
    
         until false;
      io_komm_trap:
        if -,(alarmcause shift (-24) extract 24 = (-2) and
              alarmcause extract 24 = (-13)) then
          disable skriv_io_komm(zbillede,1);
      end io_komm;
    \f

    message procedure io_spool side 1 - 810507/hko;
    
      procedure io_spool;
        begin
          integer
            næste_tomme,nr;
          integer array field
            op_ref;
    
          procedure skriv_io_spool(zud,omfang);
            value                      omfang;
            zone                   zud;
            integer                    omfang;
            begin
              disable write(zud,"nl",1,<:+++ io_spool             :>);
              if omfang > 0 then
              disable begin integer x;
                trap(slut);
                write(zud,"nl",1,
                  <:  opref:     :>,op_ref,"nl",1,
                  <:  næstetomme::>,næste_tomme,"nl",1,
                  <:  nr         :>,nr,"nl",1,
                  <::>);
                skriv_coru(zud,coru_no(102));
    slut:
              end;<*disable*>
            end skriv_io_spool;
    
          trap(io_spool_trap);
          næste_tomme:= 1;
          stack_claim((if cm_test then 200 else 146)+24 +48);
    <*+2*>
          if testbit0 and overvåget or testbit28 then
            skriv_io_spool(out,0);
    <*-2*>
    \f

    message procedure io_spool side 2 - 810602/hko;
    
          repeat
    
            wait_ch(cs_io_spool,
                    op_ref,
                    true,
                    -1<*timeout*>);
    
            i:= d.op_ref.opkode;
            if i = 22 or i = 23 or i = 36 or i = 45 or i = 46 then
            begin
              wait(ss_io_spool_tomme);
              disable modif_fil(io_spoolfil,næste_tomme,nr);
              næste_tomme:= (næste_tomme mod io_spool_postantal) +1;
    
              i:= d.op_ref.opsize;
    <*+4*>    if i > io_spool_postlængde*2 -io_spool_post then
              begin
    <*          fejlreaktion(3,i,<:postlængde,io spool:>,1);  *>
                i:= io_spool_postlængde*2 -io_spool_post;
              end;
    <*-4*>
              fil(nr,1):= real(extend d.op_ref.opsize shift 24);
              tofrom(fil(nr).io_spool_post,d.op_ref,i);
              signal(ss_io_spool_fulde);
              d.op_ref.resultat:= 1;
            end
            else
            begin
              fejlreaktion(2<*operationskode*>,d.op_ref.opkode,
                           <:io_spool_korutine:>,1);
            end;
    
            signal_ch(d.op_ref.retur,op_ref,d.op_ref.optype);
    
          until false;
    
    io_spool_trap:
    
          disable skriv_io_spool(zbillede,1);
        end io_spool;
    \f

    message procedure io_spon side 1 - 810507/hko;
    
      procedure io_spon;
        begin
          integer
            næste_fulde,nr,i,dato,kl;
          real t;
    
          procedure skriv_io_spon(zud,omfang);
            value                     omfang;
            zone                  zud;
            integer                   omfang;
            begin
              disable write(zud,"nl",1,<:+++ io_spon              :>);
              if omfang > 0 then
              disable begin integer x;
                trap(slut);
                write(zud,"nl",1,
                  <:  næste-fulde::>,næste_fulde,"nl",1,
                  <:  nr          :>,nr,"nl",1,
                  <::>);
                skriv_coru(zud,coru_no(103));
    slut:
              end;<*disable*>
            end skriv_io_spon;
    
          trap(io_spon_trap);
          næste_fulde:= 1;
          stack_claim((if cm_test then 200 else 146) +24 +48);
    <*+2*>
          if testbit0 and overvåget or testbit28 then
            skriv_io_spon(out,0);
    <*-2*>
    \f

    message procedure io_spon side 2 - 810602/hko/cl;
    
          repeat
    
    <*V*>   wait(ss_io_spool_fulde);
    <*V*>   wait(bs_zio_adgang);
    
    <*V*>   setposition(zio,0,0);
    
            disable modif_fil(io_spool_fil,næste_fulde,nr);
            næste_fulde:= (næste_fulde mod io_spool_postantal) +1;
    
            laf:=data;
            k:= fil(nr).io_spool_post.opkode;
            if k = 22 or k = 36 then
            disable begin
              write(z_io,"nl",1,if k=22 then <:auto:> else <:spring:>);
              if k=36 then
              begin
                i:= fil(nr).io_spool_post.data(4);
                j:= i extract 5;
                if j<>0 then j:=j+'A'-1;
                i:= i shift (-5) extract 10;
                write(z_io,"sp",(j=0) extract 1 + 1,<<ddd>,i,false add j,1,".",1,
                  true,4,string(extend fil(nr).io_spool_post.data(5) shift 24));
              end;
              skriv_auto_spring_medd(zio,fil(nr).io_spool_post.data,
                                     fil(nr).io_spool_post.tid)
            end
            else if k = 23 then
            disable
            begin
              write(zio,"nl",1,<:-<'>'>:>,fil(nr).io_spool_post.laf);
              dato:= systime(4,fil(nr).io_spool_post.tid,t);
              kl:= round t;
              i:= replace_char(1<*space in number*>,'.');
              write(z_io,"sp",2,<<zd_dd_dd>,dato,<< zd_dd_dd>,kl);
              replace_char(1,i);
            end
            else if k = 45 or k = 46 then
            disable begin
              integer vogn,linie,bogst,løb,t;
    
              t:=fil(nr).io_spool_post.data(2);
              outchar(z_io,'nl');
              if k = 45 then
                write(zio,<<zd.dd>,t/100.0,"sp",1);
    
              write(zio,<:nødopkald fra :>);
              vogn:= fil(nr).io_spool_post.data(1);
              i:= vogn shift (-22);
              if i < 2 then
                skrivid(zio,vogn,9)
              else
              begin
                fejlreaktion(3<*programfejl*>,vogn,<:vogn.id, spon.medd:>,1);
                write(zio,<:!!!:>,vogn);
              end;
    \f

    message procedure io_spon side 3 - 810507/hko;
    
              if fil(nr).io_spool_post.data(3)<>0 then
                write(z_io," ",1,string område_navn(fil(nr).io_spool_post.data(3)));
    
              if k = 46 then
              begin
                write(zio,<: besvaret:>,<< zd.dd>,t/100.0);
              end;
            end <*disable*>
            else
              fejlreaktion(2<*operationskode*>,k,<:io_spon_medd:>,1);
    
            fil(nr,1):= fil(nr,1) add 1;
    
    <*V*>   setposition(zio,0,0);
    
            signal_bin(bs_zio_adgang);
    
            signal(ss_io_spool_tomme);
    
          until false;
    
    io_spon_trap:
          skriv_io_spon(zbillede,1);
    
        end io_spon;  
    \f

    message procedure io_medd side 1;
    
      procedure io_medd;
      begin
        integer array field opref;
        integer afs, kl, i;
        real dato, t;
    
    
          procedure skriv_io_medd(zud,omfang);
            value                     omfang;
            zone                  zud;
            integer                   omfang;
            begin
              disable write(zud,"nl",1,<:+++ io_medd              :>);
              if omfang > 0 then
              disable begin integer x;
                trap(slut);
                write(zud,"nl",1,
                  <:  opref:    :>,opref,"nl",1,
                  <:  afs:      :>,afs,"nl",1,
                  <:  kl:       :>,kl,"nl",1,
                  <:  i:        :>,i,"nl",1,
                  <:  dato:     :>,<<zddddd>,dato,"nl",1,
                  <:  t:        :>,t,"nl",1,
                  <::>);
                skriv_coru(zud,coru_no(104));
    slut:
              end;<*disable*>
            end skriv_io_medd;
    
          trap(io_medd_trap);
          stack_claim((if cm_test then 200 else 146) +24 +48);
    <*+2*>
          if testbit0 and overvåget or testbit28 then
            skriv_io_medd(out,0);
    <*-2*>
    \f

    message procedure io_medd side 2;
    
        repeat
    <*V*> waitch(cs_io_medd,opref,gen_optype,-1);
    <*V*> wait(bs_zio_adgang);
    
          afs:= d.opref.data.op_spool_kilde;
          dato:= systime(4,d.opref.data.op_spool_tid,t);
          kl:= round t;
          write(z_io,"nl",1,<:! fra op:>,<<d>,afs,"sp",1,
            if afs=0 then <:SYSOP:> else string bpl_navn(afs));
          i:= replacechar(1,'.');
          disable write(z_io,"sp",1,<<zd_dd_dd>,kl,"nl",1);
          replacechar(1,i);
          write(z_io,d.opref.data.op_spool_text);
          setposition(z_io,0,0);
    
          signalbin(bs_zio_adgang);
          signalch((if afs=0 then d.opref.retur else cs_op),opref,d.opref.optype);
        until false;
    
    io_medd_trap:
        skriv_io_medd(zbillede,1);
    
      end io_medd;
    
      procedure io_nulstil_tællere;
      begin
        real nu, dato, kl, forr, næste, et_døgn, r;
        integer array field opref;
        integer ventetid, omr, typ, sum;
        integer array ialt(1:5);
    
          procedure skriv_io_null(zud,omfang);
            value                     omfang;
            zone                  zud;
            integer                   omfang;
            begin                            
              disable write(zud,"nl",1,<:+++ io_nulstil_tællere   :>);
              if omfang > 0 then
              disable begin real t; real array field raf;
                raf:=0;
                trap(slut);
                write(zud,"nl",1,
                  <:  opref:    :>,opref,"nl",1,
                  <:  ventetid: :>,ventetid,"nl",1,
                  <:  omr:      :>,omr,"nl",1,
                  <:  typ:      :>,typ,"nl",1,
                  <:  sum:      :>,sum,"nl",1);
                write(zud,
                  <:  nu:      :>,<< zddddd>,systime(4,nu,t),t,"nl",1);
                write(zud,
                  <:  forr:    :>,<< zddddd>,systime(4,forr,t),t,"nl",1);
                write(zud,
                  <:  næste:   :>,<< zddddd>,systime(4,næste,t),t,"nl",1);
                write(zud,
                  <:  r:       :>,<< zddddd>,systime(4,r,t),t,"nl",1,
                  <:  dato:    :>,dato,"nl",1,
                  <:  kl:      :>,kl,"nl",1,
                  <:  et-døgn: :>,<< dddddd>,et_døgn,"nl",1,
                  <::>);
                write(zud,"nl",1,<:ialt: :>);
                skriv_hele(zud,ialt.raf,10,2);
                skriv_coru(zud,coru_no(105));
    slut:
              end;<*disable*>
            end skriv_io_null;
    
          trap(io_null_trap);
          et_døgn:= 24*60*60.0;
          stack_claim(500);
    <*+2*>
          if testbit0 and overvåget or testbit28 then
            skriv_io_null(out,0);
    <*-2*>               
          pass;
    
          systime(1,0.0,nu);
          dato:= systime(4,nu,kl);
          if nulstil_systællere >= 0 then
          begin
            if kl>nulstil_systællere then næste:= systid(dato,nulstil_systællere)
                                                    + et_døgn
                                  else næste:= systid(dato,nulstil_systællere);
            forr:= næste - et_døgn;
            if (forr - systællere_nulstillet) > et_døgn then
              næste:= nu;
          end;
    
          repeat
            ventetid:= (if nulstil_systællere < 0 then (-1) else (næste - nu));
    <*V*>   waitch(cs_io_nulstil,opref,io_optype,ventetid);
    
            if opref <= 0 then
            begin
              <* nulstil opkaldstællere *>
              wait(bs_zio_adgang);
              setposition(z_io,0,0);
    
              for typ:= 1 step 1 until 5 do ialt(typ):= 0;
      
              write(z_io,"nl",1,<:!TÆ,N (automatisk):>,"nl",2,
                <:område  udgående  alm.ind  nød ind:>,
                <: ind-ialt    total   ej forb.  optaget:>,"nl",1);
              for omr := 1 step 1 until max_antal_områder do
              begin
                sum:= 0;
                write(z_io,true,6,string område_navn(omr),":",1);
                for typ:= 1 step 1 until 3 do
                begin
                  write(z_io,<<  ddddddd>,opkalds_tællere((omr-1)*5+typ));
                  sum:= sum + opkalds_tællere((omr-1)*5+typ);
                  ialt(typ):= ialt(typ)+opkalds_tællere((omr-1)*5+typ);
                end;
                write(z_io,<<  ddddddd>,
                  sum-opkalds_tællere((omr-1)*5+1),sum,"sp",2);
                for typ:= 4 step 1 until 5 do
                begin
                  write(z_io,<<  ddddddd>,opkalds_tællere((omr-1)*5+typ));
                  ialt(typ):= ialt(typ)+opkalds_tællere((omr-1)*5+typ);
                end;
                write(z_io,"nl",1);
              end;
              sum:= 0;
              write(z_io,"nl",1,<:ialt  ::>);
              for typ:= 1 step 1 until 3 do
              begin
                write(z_io,<<  ddddddd>,ialt(typ));
                sum:= sum+ialt(typ);
              end;
              write(z_io,<<  ddddddd>,sum-ialt(1),sum,"sp",2,
                ialt(4), ialt(5), "nl",3);
    
              for typ:= 1 step 1 until 5 do ialt(typ):= 0;
              write(z_io,<:oper.   udgående  alm.ind  nød ind:>,
                         <: ind-ialt    total   ej forb.  optaget:>,"nl",1);
              for omr := 1 step 1 until max_antal_operatører do
              begin
                sum:= 0;
                if bpl_navn(omr)=long<::> then
                  write(z_io,"sp",6-write(z_io,<:op:>,<<d>,omr),":",1)
                else
                  write(z_io,true,6,string bpl_navn(omr),":",1);
                for typ:= 1 step 1 until 3 do
                begin
                  write(z_io,<<  ddddddd>,operatør_tællere((omr-1)*5+typ));
                  sum:= sum + operatør_tællere((omr-1)*5+typ);
                  ialt(typ):= ialt(typ)+operatør_tællere((omr-1)*5+typ);
                end;
                write(z_io,<<  ddddddd>,
                  sum-operatør_tællere((omr-1)*5+1),sum,"sp",2);
                for typ:= 4 step 1 until 5 do
                begin
                  write(z_io,<<  ddddddd>,operatør_tællere((omr-1)*5+typ));
                  ialt(typ):= ialt(typ)+operatør_tællere((omr-1)*5+typ);
                end;
                write(z_io,"nl",1);
              end;
              sum:= 0;
              write(z_io,"nl",1,<:ialt  ::>);
              for typ:= 1 step 1 until 3 do
              begin
                write(z_io,<<  ddddddd>,ialt(typ));
                sum:= sum+ialt(typ);
              end;
              write(z_io,<<  ddddddd>,sum-ialt(1),sum,"sp",2,
                ialt(4),ialt(5),"nl",2);
    
              typ:= replacechar(1,':');
              write(z_io,<:tællere nulstilles :>);
              if nulstil_systællere=(-1) then
                write(z_io,<:ikke automatisk:>,"nl",1)
              else
                write(z_io,<:automatisk kl. :>,<<zd dd dd>,
                  nulstil_systællere,"nl",1);
              replacechar(1,'.');
              write(z_io,<:sidst nulstillet d. :>,<<zd dd dd>,
                systime(4,systællere_nulstillet,r));
              replacechar(1,':');
              write(z_io,<: kl. :>,<<zd dd dd>,r,"nl",1);
              replacechar(1,typ);
              write(z_io,"*",1,"nl",1);
              setposition(z_io,0,0);
              signal_bin(bs_zio_adgang);
    
              for omr:= 1 step 1 until max_antal_områder*5 do
                opkalds_tællere(omr):= 0;
              for omr:= 1 step 1 until max_antal_operatører*5 do
                operatør_tællere(omr):= 0;
              systællere_nulstillet:= næste;
              opdater_tf_systællere;
            end
            else
              signalch(d.opref.retur,opref,d.opref.optype);
    
            systime(1,0.0,nu);
            dato:= systime(4,nu,kl);
            if nulstil_systællere >= 0 then
            begin
              if kl>nulstil_systællere then næste:= systid(dato,nulstil_systællere)
                                                    + et_døgn
                                    else næste:= systid(dato,nulstil_systællere);
              forr:= næste - et_døgn;
            end;
          until false;            
    
    io_null_trap:
        skriv_io_null(zbillede,1);
      end io_nulstil_tællere;
    
    \f

    message operatør_erklæringer side 1 - 810602/hko;
      integer
        cs_op,cs_op_retur,cs_talevejsswitch,cs_tvswitch_adgang,cs_tv_switch_adm,
        cs_tvswitch_input, cs_op_iomedd, bs_opk_alarm, cs_opk_alarm, cs_cqf,
        cs_op_spool, cs_op_medd, ss_op_spool_tomme, ss_op_spool_fulde,
        cs_opk_alarm_ur, cs_opk_alarm_ur_ret, sidste_tv_brugt;
      integer array
        cqf_tabel(1:max_cqf*cqf_lgd//2),
        operatørmaske(1:op_maske_lgd//2),
        op_talevej(0:max_antal_operatører),
        tv_operatør(0:max_antal_taleveje),
        opk_alarm(1:max_antal_operatører*(opk_alarm_tab_lgd//2)),
        op_spool_buf(1:op_spool_postantal*(op_spool_postlgd//2)),
        ant_i_opkø,
        cs_operatør,
        cs_op_fil(1:max_antal_operatører);
      boolean
        op_cqf_tab_ændret;
      integer field
        op_spool_kilde;
      real field
        op_spool_tid;
      long array field
        op_spool_text;
      zone z_tv_in, z_tv_out(128,1,tvswitch_fejl);
      zone array z_op(max_antal_operatører,320,1,op_fejl);
    \f

    message procedure op_fejl side 1 - 830310/hko;
    
      procedure op_fejl(z,s,b);
        integer            s,b;
        zone             z;
      begin
        disable begin
          integer array iz(1:20);
          integer i,j,k,n;
          integer array field iaf,iaf1,msk;
          boolean input;
          real array field laf,laf1;
    
          getzone6(z,iz);
          iaf:=laf:=2;
          input:= iz(13) = 1;
          for laf1:= 0 step 8 until (max_antal_operatører-1)*8 do
            if iz.laf(1)=terminal_navn.laf1(1) and
               iz.laf(2)=terminal_navn.laf1(2) then j:= laf1//8 + 1;
                                                         
    <*+2*> if testbit31 then
    <**>   begin
    <**>     write(out,"nl",1,<:blockprocedure: opfejl, operatørnr::>,j,"nl",1,
    <**>       <:s=:>); outintbits(out,s);
    <**>     write(out,"nl",1,<:b=:>,b,"sp",1,if input then <:input:>
    <**>       else <:output:>,"nl",1);
    <**>     setposition(out,0,0);
    <**>   end;
    <*-2*>
          iaf:=j*terminal_beskr_længde;
          k:=1;
    
          i:= terminal_tab.iaf.terminal_tilstand;
          if i shift(-21) < 4 and (s <> (1 shift 21 +2)  <*or -,input*>) then
            fejlreaktion(17<*ydre enhed status*>,s,string iz.laf(increase(k)),
                         1 shift 12 <*binært*> +1 <*fortsæt*>);
          if s <> (1 shift 21 +2) then
          begin
            terminal_tab.iaf.terminal_tilstand:= 1 shift 23
              + terminal_tab.iaf.terminal_tilstand extract 23;
            tofrom(opkaldsflag,alle_operatører,op_maske_lgd);
            sæt_bit_ia(opkaldsflag,j,0);
            if sæt_bit_ia(operatørmaske,j,0)=1 then
            for k:= j, 65 step 1 until top_bpl_gruppe do
            begin
              msk:= k*op_maske_lgd;
              if læsbit_ia(bpl_def.msk,j) then 
    <**>      begin
                n:= 0;
                for i:= 1 step 1 until max_antal_operatører do
                if læsbit_ia(bpl_def.msk,i) then
                begin
                  iaf1:= i*terminal_beskr_længde;
                  if terminal_tab.iaf1.terminal_tilstand shift (-21) < 3 then
                    n:= n+1;
                end;  
                bpl_tilst(j,1):= n;
              end;
    <**> <*
                bpl_tilst(j,1):= bpl_tilst(j,1)-1;
      *>    end;
            signal_bin(bs_mobil_opkald);
          end;
    
          if input or -,input then
          begin
            z(1):=real <:<'?'><'?'><'em'>:>;
            b:=2;
          end;
        end; <*disable*>
      end op_fejl;
    \f

    message procedure tvswitch_fejl side 1 - 940426/cl;
    
      procedure tvswitch_fejl(z,s,b);
        integer                 s,b;
        zone                  z;
      begin
        disable begin
          integer array iz(1:20);
          integer i,j,k;
          integer array field iaf;
          boolean input;
          real array field raf;
    
          getzone6(z,iz);
          iaf:=raf:=2;
          input:= iz(13) = 1;
    <*+2*> if testbit31 then
    <**>   begin
    <**>     write(out,"nl",1,<:blockprocedure: tvswitch:>,"nl",1,
    <**>       <:s=:>); outintbits(out,s);
    <**>     write(out,"nl",1,<:b=:>,b,"sp",1,if input then <:input:>
    <**>       else <:output:>,"nl",1);
    <**>     skrivhele(out,z,b,5);
    <**>     setposition(out,0,0);
    <**>   end;
    <*-2*>
          k:=1;
          if s <> (1 shift 21 +2) then
            fejlreaktion(17<*ydre enhed status*>,s,string iz.raf(increase(k)),
                         1 shift 12 <*binært*> +1 <*fortsæt*>);
    
          if input or -,input then
          begin
            z(1):=real <:<'em'>:>;
            b:=2;
          end;
        end; <*disable*>
        if testbit22 and (s <> (1 shift 21 +2)) then delay(60);
      end tvswitch_fejl;
    
    procedure skriv_talevejs_tab(z);
      zone z;
    begin
      write(z,"nl",2,<:talevejsswitch::>);
      write(z,"nl",1,<:  operatører::>,"nl",1);
      for i:= 1 step 1 until max_antal_operatører do
      begin
        write(z,<< dd>,i,":",1,op_talevej(i));
        if i mod 8=0 then outchar(z,'nl');
      end;
      write(z,"nl",1,<:  taleveje::>,"nl",1);
      for i:= 1 step 1 until max_antal_taleveje do
      begin
        write(z,<< dd>,i,":",1,tv_operatør(i));
        if i mod 8=0 then outchar(z,'nl');
      end;
      write(z,"nl",3);
    end;                                                      
    \f

    message procedure skriv_opk_alarm_tab side 1;
    
    procedure skriv_opk_alarm_tab(z);
    zone                          z;
    begin
      integer nr;
      integer array field tab;
      real t;
    
      write(z,"nl",2,<:opkaldsalarmtabel::>,"nl",1,
        <:operatør    kmdo tilst gl.tilst længde start:>,"nl",1);
      for nr:=1 step 1 until max_antal_operatører do
      begin
        tab:= (nr-1)*opk_alarm_tab_lgd;
        write(z,<< dd >,nr,true,6,string bpl_navn(nr),<::   :>,
          case opk_alarm.tab.alarm_kmdo+1 of ("-","B","C","F"),1,"sp",5,
          case opk_alarm.tab.alarm_tilst+1 of ("-","B","C","?"),1,"sp",8,
          case opk_alarm.tab.alarm_gtilst+1 of ("-","B","C","?"),1,"sp",2,
          <<-dddd>,opk_alarm.tab.alarm_lgd,"sp",1,
          << zddddd>,systime(4,opk_alarm.tab.alarm_start,t),t,
          "nl",1);
      end;
    end;
    \f

    message procedure skriv_op_spool_buf side 1;
    
    procedure skriv_op_spool_buf(z);
      zone                       z;
    begin
      integer array field ref;
      integer nr, kilde;
      real dato, kl; 
    
      write(z,"nl",2,<:op<'_'>spool<'_'>buffer::>,"nl",1);
      for nr:= 1 step 1 until op_spool_postantal do
      begin
        write(z,"nl",1,<:nr.::>,<< dd>,nr);
        ref:= (nr-1)*op_spool_postlgd;
        if op_spool_buf.ref.op_spool_tid <> real<::> then
        begin
          kilde:= op_spool_buf.ref.op_spool_kilde;
          dato:= systime(4,op_spool_buf.ref.op_spool_tid,kl);
          write(z,<: fra op:>,<<d>,kilde,"sp",1,
            if kilde=0 then <:SYSOP:> else string bplnavn(kilde),
            "sp",1,<<zddddd.dddddd>,dato+kl/1000000,"nl",1,
            op_spool_buf.ref.op_spool_text);
        end;
        outchar(z,'nl');
      end;
    end;
    
    procedure skriv_cqf_tabel(z,lang);
      value                     lang;
      zone                    z;
      boolean                   lang;
    begin
      integer array field ref;
      integer i,ant;
      real dato, kl;
    
      ant:= 0;
      write(z,"nl",1,<:CQF testbus-tabel::>,"nl",2,(
        if -,lang then
        <: tnr. navn  fejl      sidste_ok   tnr. navn  fejl      sidste_ok:>
        <* 9900 XXxxx    1  yymmdd.ttmmss   9900 XXxxx    1  yymmdd.ttmmss*>
        else
        <:nr: tnr. navn  fejl      sidste_ok     næste_test:>),"nl",1);
        <*01: 9900 XXxxx    1  yymmdd.ttmmss  yymmdd.hhttmm*>
      for i:= 1 step 1 until max_cqf do
      begin
        ref:= (i-1)*cqf_lgd;
        if cqf_tabel.ref.cqf_bus<>0 or lang then
        begin
          ant:= ant+1;
          if lang then
            write(z,<<dd>,i,":",1);
          write(z,<< dddd>,cqf_tabel.ref.cqf_bus,"sp",1,true,6,
            string cqf_tabel.ref.cqf_id,<<dddd>,cqf_tabel.ref.cqf_fejl);
          if cqf_tabel.ref.cqf_ok_tid<>real<::> then
          begin
            dato:= systime(4,cqf_tabel.ref.cqf_ok_tid,kl);
            write(z,<<  zddddd.dddddd>,dato+kl/1000000);
          end
          else
            write(z,"sp",14,"?",1);
          if lang then
          begin
            if cqf_tabel.ref.cqf_næste_tid<>real<::> then
            begin
              dato:= systime(4,cqf_tabel.ref.cqf_næste_tid,kl);
              write(z,<<  zddddd.dddddd>,dato+kl/1000000);
            end
            else
              write(z,"sp",14,"?",1);
          end
          else
            write(z,"sp",2);
          if lang or (ant mod 2)=0 then outchar(z,'nl');
        end;
      end;
      if -,lang and (ant mod 2)=1 then outchar(z,'nl');
    end;
    
        procedure sorter_cqftab(l,u);
          value                 l,u;
          integer               l,u;
        begin
          integer array field ii,jj;
          integer array ww,xx(1:(cqf_lgd+1)//2);
    
          ii:= ((l+u)//2 - 1)*cqf_lgd;
          tofrom(xx,cqf_tabel.ii,cqf_lgd);
          ii:= (l-1)*cqf_lgd; jj:= (u-1)*cqf_lgd;
          repeat
            while (cqf_tabel.ii(1) < xx(1)) do ii:= ii+cqf_lgd;
            while (xx(1) < cqf_tabel.jj(1)) do jj:= jj-cqf_lgd;
            if ii <= jj then
            begin
              tofrom(ww,cqf_tabel.ii,cqf_lgd);
              tofrom(cqf_tabel.ii,cqf_tabel.jj,cqf_lgd);
              tofrom(cqf_tabel.jj,ww,cqf_lgd);
              ii:= ii+cqf_lgd;
              jj:= jj-cqf_lgd;
            end;
          until ii>jj;
          if l < jj//cqf_lgd+1 then sorter_cqftab(l,jj//cqf_lgd+1);
          if ii//cqf_lgd+1 < u then sorter_cqftab(ii//cqf_lgd+1,u);
        end;
    \f

    message procedure ht_symbol side 1 - 851001/cl;
    
    procedure ht_symbol(z);
      zone              z;
    write(z,"esc" add 128,1,<:ÆH:>,"esc" add 128,1,<:ÆJ:>,<:
    
    
    
    
                        @@         @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
                       @@         @@                               @@
                      @@         @@                               @@
                     @@         @@                               @@
                    @@         @@@@@@@@@@@@@         @@@@@@@@@@@@@
                   @@                               @@
                  @@                               @@
                 @@                               @@
                @@         @@@@@@@@@@@@@         @@
               @@         @@         @@         @@
              @@         @@         @@         @@
             @@         @@         @@         @@
            @@@@@@@@@@@@@         @@@@@@@@@@@@@
    :>,"esc" add 128,1,<:Æ24;1H:>);
    \f

    message procedure definer_taster side 1 - 891214,cl;
    
    procedure definer_taster(nr);
      value                  nr;
      integer                nr;
    begin
    
      setposition(z_op(nr),0,0);
      write(z_op(nr),
        "esc" add 128,1, <:P1;2;0ø58/1B4E450D:>,
        "esc" add 128,1, <:Ø:>, <* f1    = <esc>NE<cr> *>
        "esc" add 128,1, <:P1;2;0ø59/1B4F500D:>,
        "esc" add 128,1, <:Ø:>, <* f2    = <esc>OP<cr> *>
        "esc" add 128,1, <:P1;2;0ø5A/1B4F502C560D:>,
        "esc" add 128,1, <:Ø:>, <* f3    = <esc>OP,V<cr> *>
        "esc" add 128,1, <:P1;2;0ø5B/1B4F502C5420:>,
        "esc" add 128,1, <:Ø:>, <* f4    = <esc>OP,T<sp> *>
        "esc" add 128,1, <:P1;2;0ø5C/1B4F502C4120:>,
        "esc" add 128,1, <:Ø:>, <* f5    = <esc>OP,A<sp> *>
        "esc" add 128,1, <:P1;2;1ø5C/1B4F502C4120:>,
        "esc" add 128,1, <:Ø:>, <* s-f5  = <esc>OP,A<sp> *>
        "esc" add 128,1, <:P1;2;0ø5D/1B4D452C4120:>,
        "esc" add 128,1, <:Ø:>, <* f6    = <esc>ME,A<sp> *>
        "esc" add 128,1, <:P1;2;1ø5D/1B4D452C4120:>,
        "esc" add 128,1, <:Ø:>, <* s-f6  = <esc>ME,A<sp> *>
        "esc" add 128,1, <:P1;2;0ø5E/1B4F5020:>,
        "esc" add 128,1, <:Ø:>, <* f7    = <esc>OP<sp>   *>
        "esc" add 128,1, <:P1;2;0ø5F/1B56450D:>,
        "esc" add 128,1, <:Ø:>, <* f8    = <esc>VE<cr>   *>
        "esc" add 128,1, <:P1;2;0ø60/1B4D4F20:>,
        "esc" add 128,1, <:Ø:>, <* f9    = <esc>MO<sp>   *>
        "esc" add 128,1, <:P1;2;1ø60/1B520D:>,
        "esc" add 128,1, <:Ø:>, <* s-f9  = <esc>R<cr>    *>
        "esc" add 128,1, <:P1;2;0ø61/1B53540D:>,
        "esc" add 128,1, <:Ø:>, <* f10   = <esc>ST<cr>   *>
        "esc" add 128,1, <:P1;2;0ø62/1B474520:>,
        "esc" add 128,1, <:Ø:>, <* f11  = <esc>GE<sp> *>
        "esc" add 128,1, <:P1;2;1ø62/1B47452C4720:>,
        "esc" add 128,1, <:Ø:>, <* s-f11  = <esc>GE,G<sp> *>
        "esc" add 128,1, <:P1;2;0ø63/1B47452C560D:>,
        "esc" add 128,1, <:Ø:>, <* f12  = <esc>GE,V<cr> *>
        "esc" add 128,1, <:P1;2;1ø63/1B47452C540D:>,
        "esc" add 128,1, <:Ø:>, <* s-f12  = <esc>GE,T<sp> *>
        "esc" add 128,1, <:P1;2;0ø7B/1B564F2C4920:>,
        "esc" add 128,1, <:Ø:>, <* Ins   = <esc>VO,I<sp> *>
        "esc" add 128,1, <:P1;2;0ø79/1B564F2C5520:>,
        "esc" add 128,1, <:Ø:>, <* Del   = <esc>VO,U<sp> *>
        "esc" add 128,1, <:P1;2;0ø7F/1B564F2C4620:>,
        "esc" add 128,1, <:Ø:>, <* Home  = <esc>VO,F<sp> *>
        "esc" add 128,1, <:P1;2;0ø7A/1B564F2C5220:>,
        "esc" add 128,1, <:Ø:>, <* End   = <esc>VO,R<sp> *>
        "esc" add 128,1, <:P1;2;0ø6F/1B564F2C4C20:>,
        "esc" add 128,1, <:Ø:>, <* PgUp  = <esc>VO,L<sp> *>
        "esc" add 128,1, <:P1;2;0ø7E/1B564F2C4220:>,
        "esc" add 128,1, <:Ø:>, <* PgDn  = <esc>VO,B<sp> *>
        "esc" add 128,1, <:P1;2;0ø0E/082008:>,
        "esc" add 128,1, <:Ø:>, <* Back  = <bs><sp><bs> *>
        <::>);
      end;
    \f

    message procedure skriv_terminal_tab side 1 - 820301/hko;
    
      procedure skriv_terminal_tab(z);
        zone                       z;
        begin
          integer array field ref;
          integer t1,i,j,id,k;
    
          write(z,"ff",1,<:
          ******* terminalbeskrivelser ********
    
                        # a k l p m m n o
                        1 l a y a o o ø p
    nr tilst   -  vnt R 0 l t t s n b d t type ident    id i kø:>);
    <*
    01   15 .... .... X X X X X X X X X X MEDD 9999.abc 888B/77
    *>
          for i:=1 step 1 until max_antal_operatører do
          begin
            ref:=i*terminal_beskr_længde;
            t1:=terminal_tab.ref(1);
            id:=terminal_tab.ref(2);
            k:=terminal_tab.ref(3);
            write(z,"nl",1,"sp",4,<<dd>,i,<< dddd>,t1 shift(-21),
              t1 shift(-16) extract 5,t1 shift(-12) extract 4,
              "sp",1);
            for j:=11 step -1 until 2 do
              write(z,if læs_bit_i(t1,j) then "X" else "sp",1,"sp",1);
            write(z,case t1 extract 2 +1 of (<:-   :>,<:OPK :>,<:MEDD:>,<:GNM :>),
              "sp",1);
            skriv_id(z,id,9);
            skriv_id(z,k,9);
          end;
          write(z,"nl",2,<:samtaleflag::>,"nl",1);
          outintbits_ia(z,samtaleflag,1,op_maske_lgd//2);
          write(z,"nl",1);
        end skriv_terminal_tab;
    \f

    message procedure h_operatør side 1 - 810520/hko;
    
      <* hovedmodulkorutine for operatørterminaler *>
      procedure h_operatør;
      begin
        integer array field op_ref;
        integer k,nr,ant,ref,dest_sem;
        procedure skriv_hoperatør(zud,omfang);
          value                     omfang;
          zone                  zud;
          integer                   omfang;
          begin
    
            write(zud,"nl",1,<:+++ hovedmodul operatør  :>);
            if omfang>0 then
            disable begin integer x;
              trap(slut);
              write(zud,"nl",1,
                <:  op_ref:    :>,op_ref,"nl",1,
                <:  nr:        :>,nr,"nl",1,
                <:  ant:       :>,ant,"nl",1,
                <:  ref:       :>,ref,"nl",1,
                <:  k:         :>,k,"nl",1,
                <:  dest_sem:  :>,dest_sem,"nl",1,
                <::>);
              skriv_coru(zud,coru_no(200));
    slut:
            end;
         end skriv_hoperatør;
    
      trap(hop_trap);
      stack_claim(if cm_test then 198 else 146);
    
    <*+2*>
      if testbit8 and overvåget or testbit28 then
        skriv_hoperatør(out,0);
    <*-2*>
    \f

    message procedure h_operatør side 2 - 820304/hko;
    
      repeat
        wait_ch(cs_op,op_ref,true,-1);
    <*+4*>
        if (d.op_ref.optype and (op_optype or gen_optype)) extract 12 =0
        then fejlreaktion(12<*operationstype*>,op_ref,<:operatør:>,1);
    <*-4*>
    
        k:=d.op_ref.opkode extract 12;
        dest_sem:=
          if k=0 and d.opref.kilde=299 then cs_talevejsswitch else
          if k=0 then cs_operatør(d.op_ref.kilde mod 100) else
          if k=1 or k=2 or k=43 then cs_operatør(d.op_ref.data(1)) else
          if k=4 then cs_operatør(d.op_ref.data(2)) else
          if k=37 then cs_op_spool else
          if k=40 or k=38 then 0
          else -1;
    <*+4*>
        if dest_sem=-1 then
        begin
          fejl_reaktion(2<*operationskode*>,k,<:hovedmodul operatør:>,1);
          signal_ch(d.op_ref.retur,op_ref,d.op_ref.optype);
        end
        else
    <*-4*>
        if k=40 then
        begin
          dest_sem:= d.op_ref.retur;
          d.op_ref.retur:= cs_op_retur;
          for nr:= 1 step 1 until max_antal_operatører do
          begin
            inspect_ch(cs_operatør(nr),genoptype,ant);
            if ant < 0 and (læsbit_ia(opkaldsflag,nr) or læsbit_ia(kanalflag,nr)
                            or læsbit_ia(samtaleflag,nr)) 
                       and læsbit_ia(operatørmaske,nr) then
            begin
              ref:= op_ref;
              signal_ch(cs_operatør(nr),opref,d.op_ref.optype);
    <*V*>     wait_ch(cs_op_retur,op_ref,true,-1);
    <*+4*>    if op_ref <> ref then
                fejlreaktion(11<*fr.post*>,op_ref,
                  <:opdater opkaldskø,retur:>,0);
    <*-4*>
            end;
          end;
          d.op_ref.retur:= dest_sem;
          signal_ch(dest_sem,op_ref,d.op_ref.optype);
        end
        else
        if k=38 then
        begin
          dest_sem:= d.opref.retur;
          d.op_ref.retur:= cs_op_retur;
          for nr:= 1 step 1 until max_antal_operatører do
          begin
            if d.opref.data.op_spool_kilde <> nr then
            begin
              ref:= op_ref;
              signal_ch(cs_operatør(nr),opref,d.op_ref.optype);
    <*V*>     wait_ch(cs_op_retur,op_ref,true,-1);
    <*+4*>    if op_ref <> ref then
                fejlreaktion(11<*fr.post*>,op_ref,
                  <:opdater opkaldskø,retur:>,0);
    <*-4*>
            end;
          end;
          if d.opref.data.op_spool_kilde<>0 then
          begin
            ref:= op_ref;
            nr:= d.opref.data.op_spool_kilde;
            signal_ch(cs_operatør(nr),opref,d.op_ref.optype);
    <*V*>   wait_ch(cs_op_retur,op_ref,true,-1);
    <*+4*>  if op_ref <> ref then
              fejlreaktion(11<*fr.post*>,op_ref,
                <:operatørmedddelelse, retur:>,0);
    <*-4*>
            d.op_ref.retur:= dest_sem;
            signal_ch(dest_sem,op_ref,d.op_ref.optype);
          end
          else
          begin
            d.op_ref.retur:= dest_sem;
            signal_ch(cs_io,op_ref,d.op_ref.optype);
          end;
        end
        else
        begin
    \f

    message procedure h_operatør side 3 - 810601/hko;
    
          if k=8<*ekskluder*> then <*afbryd kommando v. timeout*>
          begin
            iaf:=d.op_ref.data(1)*terminal_beskr_længde;
            terminal_tab.iaf.terminal_tilstand:= 7 shift 21
              +terminal_tab.iaf.terminal_tilstand extract 21;
          end;
          signal_ch(dest_sem,op_ref,d.op_ref.optype);
        end;
      until false;
    
    hop_trap:
      disable skriv_hoperatør(zbillede,1);
      end h_operatør;
    \f

    message procedure operatør side 1 - 820304/hko;
    
      procedure operatør(nr);
        value          nr;
        integer        nr;
      begin
        integer array field op_ref,ref,vt_op,iaf,tab;
        integer i,kode,aktion,status,tilstand,bv,bs,bs_tilst,
                kanal,opgave,pos,indeks,sep,sluttegn,rkom, par1, par2,
                vogn,ll,garage,skærmmåde,res,s_kanal,v_kanal;
        real kommstart,kommslut;
    \f

    message procedure operatør side 1a - 820301/hko;
    
        procedure skriv_operatør(zud,omfang);
          value                      omfang;
          zone                   zud;
          integer                    omfang;
          begin integer i;
    
            i:= write(zud,"nl",1,<:+++ operatør nr::>,nr);
            write(zud,"sp",26-i);
            if omfang > 0 then
            disable begin
              integer x;
              trap(slut);
              write(zud,"nl",1,
                <:  op-ref:    :>,op_ref,"nl",1,
                <:  kode:      :>,kode,"nl",1,
                <:  aktion:    :>,aktion,"nl",1,
                <:  ref:       :>,ref,"nl",1,
                <:  vt_op:     :>,vt_op,"nl",1,
                <:  iaf:       :>,iaf,"nl",1,
                <:  status:    :>,status,"nl",1,
                <:  tilstand:  :>,tilstand,"nl",1,
                <:  bv:        :>,bv,"nl",1,
                <:  bs:        :>,bs,"nl",1,
                <:  bs-tilst:  :>,bs_tilst,"nl",1,
                <:  kanal:     :>,kanal,"nl",1,
                <:  opgave:    :>,opgave,"nl",1,
                <:  pos:       :>,pos,"nl",1,
                <:  indeks:    :>,indeks,"nl",1,
                <:  sep:       :>,sep,"nl",1,
                <:  sluttegn:  :>,sluttegn,"nl",1,
                <:  vogn:      :>,vogn,"nl",1,
                <:  ll:        :>,ll,"nl",1,
                <:  garage:    :>,garage,"nl",1,
                <:  skærmmåde: :>,skærmmåde,"nl",1,
                <:  res:       :>,res,"nl",1,
                <:  tab:       :>,tab,"nl",1,
                <:  rkom:      :>,rkom,"nl",1,
                <:  par1:      :>,par1,"nl",1,
                <:  par2:      :>,par2,"nl",1,
                <::>);
              skriv_coru(zud,coru_no(200+nr));
    slut:
            end;
          end skriv_operatør;
    \f

    message procedure skærmstatus side 1 - 810518/hko;
    
      integer
      procedure skærmstatus(tilstand,b_v,b_s,b_s_tilst);
        integer             tilstand,b_v,b_s,b_s_tilst;
        begin
          integer i,j;
    
          i:= terminal_tab.ref(1);
          b_s:= terminal_tab.ref(2);
          b_s_tilst:= i extract 12;
          j:= b_s_tilst extract 3;
          b_v:= i shift (-12) extract 4;
          tilstand:= i shift (-21);
    
          skærmstatus:= if b_v = 0 and b_s = 0 then 0 else
                        if b_v = 0 and j = 1<*opkald*> then 1 else
                        if b_v = 0 and j = 2<*specialopkald*>  then 2 else
                        if (bv<>0) and (bs<>0) and (j=3) then 4 else 3;
        end skærmstatus;
    \f

    message procedure skriv_skærm side 1 - 810522/hko;
    
      procedure skriv_skærm(nr);
        value               nr;
        integer             nr;
        begin
          integer i;
    
          disable definer_taster(nr);
    
          skriv_skærm_maske(nr);
          skriv_skærm_opkaldskø(nr);
          skriv_skærm_b_v_s(nr);
          for i:= 1 step 1 until max_antal_kanaler do
            skriv_skærm_kanal(nr,i);
          cursor(z_op(nr),1,1);
    <*V*> setposition(z_op(nr),0,0);
        end skriv_skærm;
    \f

    message procedure skriv_skærm_id side 1 - 830310/hko;
    
      procedure skriv_skærm_id(nr,id,nød);
        value                  nr,id,nød;
        integer                nr,id;
        boolean                      nød;
        begin
          integer linie,løb,bogst,i,p;
    
          i:= id shift (-22);
    
          case i+1 of
          begin
            begin <* busnr *>
              p:= write(z_op(nr),if nød then "*" else "sp",1,<<bddd>,
                    (id extract 14) mod 10000);
              if id shift (-14) extract 8 > 0 then
                p:= p+write(z_op(nr),".",1,
                    string bpl_navn(id shift (-14) extract 8));
              write(z_op(nr),"sp",11-p);
            end;
    
            begin <*linie/løb*>
              linie:= id shift (-12) extract 10;
              bogst:= id shift (-7) extract 5;
              if bogst > 0 then bogst:= bogst +'A'-1;
              løb:= id extract 7;
              write(z_op(nr),if nød then "*" else "sp",1,
                "sp",if bogst=0 then 1 else 0,<<ddd>,linie,<<d>,
                false add bogst,1,"/",1,løb,
                "sp",if løb > 9 then 3 else 4);
            end;
    
            begin <*gruppe*>
              write(z_op(nr),<:GRP  :>);
              if id shift (-21) extract 1 = 1 then
              begin <*specialgruppe*>
                løb:= id extract 7;
                write(z_op(nr),"sp",if løb > 9 then 1 else 2,<:G:>,
                  <<d>,løb,"sp",2);
              end
              else
              begin
                linie:= id shift (-5) extract 10;
                bogst:= id extract 5;
                if bogst > 0 then bogst:= bogst +'A'-1;
                write(z_op(nr),"sp",if bogst > 0 then 1 else 0,<<ddd>,linie,
                  false add bogst,1,"sp",2);
              end;
            end;
    
            <* kanal eller område *>
            begin
              linie:= (id shift (-20) extract 2) + 1;
              case linie of
              begin
                write(z_op(nr),"sp",11-write(z_op(nr),
                  string kanal_navn(id extract 20)));
                write(z_op(nr),<:K*:>,"sp",9);
                write(z_op(nr),"sp",11-write(z_op(nr),
                  <:OMR :>,string område_navn(id extract 20)));
                write(z_op(nr),<:ALLE:>,"sp",7);
              end;
            end;
    
          end <* case i *>
        end skriv_skærm_id;
    \f

    message procedure skriv_skærm_kanal side 1 - 820301/hko;
    
      procedure skriv_skærm_kanal(nr,kanal);
        value                     nr,kanal;
        integer                   nr,kanal;
        begin
          integer i,j,k,t,omr;
          integer array field tref,kref;
          boolean nød;
    
          tref:= nr*terminal_beskr_længde;
          kref:= (kanal-1)*kanal_beskr_længde;
          t:= kanaltab.kref.kanal_tilstand;
          j:= terminal_tab.tref(1) shift (-12) extract 4; <* b_v kanalnr *>
          k:= terminal_tab.tref(2); <* 3 shift 22 +kanal, hvis samtale *>
          cursor(z_op(nr),kanal+2,28);
          write(z_op(nr),if læsbit_i(kanaltab.kref.kanal_tilstand,10) then "*" else
                         if læsbit_i(kanaltab.kref.kanal_tilstand,11) then "+" else
                         " ",1," ",1);
          write(z_op(nr),true,6,string kanal_navn(kanal));
          omr:= if kanal_id(kanal) shift (-5) extract 3 = 2 then
                  pabx_id(kanal_id(kanal) extract 5)
                else
                  radio_id(kanal_id(kanal) extract 5);
          for i:= -2 step 1 until 0 do
          begin
            write(z_op(nr),
              if område_id(omr,1) shift (8*i) extract 8 = 0 then " "
              else false add (område_id(omr,1) shift (8*i) extract 8),1);
          end;
          write(z_op(nr),<:: :>);
          i:= tv_operatør(kanaltab.kref.kanal_tilstand shift (-16));<*operatør*>
          if læsbit_ia(kanaltab.kref.kanal_alarm, nr) then
          begin
            sætbit_ia(kanaltab.kref.kanal_alarm, nr, 0);
            <* write(z_op(nr),<:ALARM !:>,"bel",1); *>
          end
          else
          if kanaltab.kref.kanal_tilstand shift (-12) extract 4 = 15 then
            write(z_op(nr),<:-:><*UDE AF DRIFT*>)
          else
          if i > 0 and 
              ( true <* i <> nr *> <* OPT også ud på egen skærm 960527/CL *> or
                 j = kanal <* kanal = kanalnr for ventepos *> or
                 (terminal_tab.tref.terminal_tilstand shift (-21) = 1
                  <*tilst=samtale*> and k extract 22 = kanal) ) then
          begin
             write(z_op(nr),<:OPT :>);
             if bpl_navn(i)=long<::> then write(z_op(nr),<:op:>,<<d>,i)
             else write(z_op(nr),string bpl_navn(i));
          end
          else
          if false then
          begin
            i:= kanaltab.kref.kanal_id1;
            nød:= læsbit_i(kanaltab.kref.kanal_tilstand,3);
            skriv_skærm_id(nr,i,nød);
            write(z_op(nr),if t extract 2 = 3 then <:GNM :> else <:OPKALDT:>);
            i:= kanaltab.kref.kanal_id2;
            if i<>0 then skriv_skærm_id(nr,i,false);
          end;
          write(z_op(nr),"esc" add 128,1,<:ÆK:>);
        end skriv_skærm_kanal;
    \f

    message procedure skriv_skærm_b_v_s side 1 - 810601/hko;
    
      procedure skriv_skærm_b_v_s(nr);
        value                     nr;
        integer                   nr;
        begin
          integer i,j,k,kv,ks,t;
          integer array field tref,kref;
    
          tref:= nr*terminal_beskr_længde;
          i:= terminal_tab.tref.terminal_tilstand;
          kv:= i shift (-12) extract 4;
          ks:= terminaltab.tref(2) extract 20;
    <*V*> setposition(z_op(nr),0,0);
          cursor(z_op(nr),18,28);
          write(z_op(nr),"esc" add 128,1,<:ÆK:>);
          cursor(z_op(nr),20,28);
          write(z_op(nr),"esc" add 128,1,<:ÆK:>);
          cursor(z_op(nr),21,28);
          write(z_op(nr),"esc" add 128,1,<:ÆK:>);
          cursor(z_op(nr),20,28);
          if op_talevej(nr)<>0 then
          begin
            cursor(z_op(nr),18,28);
            write(z_op(nr),<:talevej: :>,<<d>,op_talevej(nr));
          end;
          if kv <> 0 then
          begin
            kref:= (kv-1)*kanal_beskr_længde;
            j:= if kv<>ks then kanaltab.kref.kanal_id1
                else kanaltab.kref.kanal_id2;
            k:= if kv<>ks then kanaltab.kref.kanal_alt_id1
                else kanaltab.kref.kanal_alt_id2;
            write(z_op(nr),true,6,string kanal_navn(kv));
            skriv_skærm_id(nr,j,kanaltab.kref.kanaltilstand shift(-3) extract 1=1);
            skriv_skærm_id(nr,k,false);
            write(z_op(nr),if i extract 2 = 3 then <:GNM:> else <:VNT:>);
          end;
    
          cursor(z_op(nr),21,28);
          j:= terminal_tab.tref(2);
          if i shift (-21) <> 0 <*ikke ledig*> then
          begin
    \f

    message procedure skriv_skærm_b_v_s side 2 - 841210/cl;
    
            if i shift (-21) = 1 <*samtale*> then
            begin
              if j shift (-20) = 12 then
              begin
                write(z_op(nr),true,6,string kanal_navn(ks));
              end
              else
              begin
                write(z_op(nr),true,6,<:K*:>);
                k:= 0;
                while ks shift (-k) extract 1 = 0 and k<max_antal_kanaler do
                  k:= k+1;
                ks:= k;
              end;
              kref:= (ks-1)*kanal_beskr_længde;
              t:= kanaltab.kref.kanaltilstand;
              skriv_skærm_id(nr,kanaltab.kref.kanal_id1,
                             t shift (-3) extract 1 = 1);
              skriv_skærm_id(nr,kanaltab.kref.kanal_alt_id1,false);
              write(z_op(nr),if i shift (-11) extract 1 = 1 then <:-P-:> else
                if t shift (-5) extract 1 = 1 then <:MON :> else
                if t shift (-4) extract 1 = 1 then <:BSV :> else
                if t shift (-6) extract 1 = 1 then <:PAS :> else
                if t shift (-7) extract 1 = 1 then <:LYT :> else <:TAL :>);
              if t shift (-9) extract 1 = 1 then
                write(z_op(nr),<:ALLE :>);
              if t shift (-8) extract 1 = 1 then
                write(z_op(nr),<:KATASTROFE :>);
              k:= kanaltab.kref.kanal_spec;
              if t extract 2 <> 3 and t shift (-4) extract 1 = 1 then
                write(z_op(nr),<<zd.dd>,(k extract 12)/100);
            end
            else <* if i shift (-21) = 2 <+optaget+> then *>
            begin
              write(z_op(nr),<:K-:>,"sp",3);
              if j <> 0 then
                skriv_skærm_id(nr,j,false)
              else
              begin
                j:=terminal_tab.tref(3);
                skriv_skærm_id(nr,j,
                  false add (if i shift(-4) extract 1 = 1 then 2 <* mobil opk. *>
                                                         else 0));
              end;
              write(z_op(nr),<:OPT:>);
            end;
          end;
    <*V*> setposition(z_op(nr),0,0);
        end skriv_skærm_b_v_s;
    \f

    message procedure skriv_skærm_maske side 1 - 810511/hko;
    
      procedure skriv_skærm_maske(nr);
        value                     nr;
        integer                   nr;
        begin
          integer i;
    <*V*> setposition(z_op(nr),0,0);
          write(z_op(nr),"esc" add 128,1,<:ÆH:>,"esc" add 128,1,<:ÆJ:>,
           "sp",26,"*",5,<: operatør :>,<<d>,nr,"sp",1,string bpl_navn(nr),
           "sp",1,"*",5,"nl",1,"-",80);
    
          for i:= 3 step 1 until 21 do
          begin
            cursor(z_op(nr),i,26);
            outchar(z_op(nr),'!');
          end;
          cursor(z_op(nr),22,1);
          write(z_op(nr),"-",80);
          cursor(z_op(nr),1,1);
    <*V*> setposition(z_op(nr),0,0);
        end skriv_skærm_maske;
    \f

    message procedure skal_udskrives side 1 - 940522/cl;
    
    boolean procedure skal_udskrives(fordelt_til,aktuel_skærm);
      value                          fordelt_til,aktuel_skærm;
      integer                        fordelt_til,aktuel_skærm;
    begin
      boolean skal_ud;
      integer n;
      integer array field iaf;
    
      skal_ud:= true;
      if fordelt_til > 0 and fordelt_til<>aktuel_skærm then
      begin
        for n:= 0 step 1 until 3 do
        begin
          if bpl_tilst(operatør_stop(fordelt_til,n),1) > 0 then
          begin
            iaf:= operatør_stop(fordelt_til,n)*op_maske_lgd;
            skal_ud:= læsbit_ia(bpl_def.iaf,aktuel_skærm);
            goto returner;
          end;
        end;
      end;
    returner:
      skal_udskrives:= skal_ud;
    end;
    
    message procedure skriv_skærm_opkaldskø side 1 - 820301/hko;
        
      procedure skriv_skærm_opkaldskø(nr);
        value                         nr;
        integer                       nr;
        begin
          integer i,ant,vogn,type,operatør,ttmm,linie,bogst,løb,kmdo;
          integer array field ref,iaf,tab;
          boolean skal_ud;
    
    <*V*> wait(bs_opkaldskø_adgang);
          setposition(z_op(nr),0,0);
          ant:= 0; kmdo:= 0;
          tab:= (nr-1)*opk_alarm_tab_lgd;
          ref:= første_nødopkald;
          if ref=0 then ref:=første_opkald;
          while ref <> 0 do
          begin
            i:= opkaldskø.ref(4);
            operatør:= i extract 8;
            type:=i shift (-8) extract 4;
    
    <*      skal_ud:= operatør = nr or -,læsbit_ia(operatørmaske,operatør);
    *>
            if operatør > 64 then
            begin
              <* fordelt til gruppe af betjeningspladser *>
              i:= 0; skal_ud:= true; iaf:= operatør*op_maske_lgd;
              while skal_ud and i<max_antal_operatører do
              begin
                i:=i+1;
                if læsbit_ia(bpl_def.iaf,i) then
                  skal_ud:= skal_ud and skal_udskrives(i,nr);
              end;
            end
            else
              skal_ud:= skal_udskrives(operatør,nr);
            if skal_ud then
            begin
              ant:= ant +1;
              if ant < 6 then
              begin
    <*V*>       cursor(z_op(nr),ant*2+1,3);
                ttmm:= i shift (-12);
                vogn:= opkaldskø.ref(3);
                if vogn = 0 then vogn:= opkaldskø.ref(2) extract 22;
                skriv_skærm_id(nr,vogn,type=2);
                write(z_op(nr),true,4,
                  string område_navn(opkaldskø.ref(5) extract 4),
                  <<zd.dd>,ttmm/100.0);
                if -, læsbit_ia(opkaldskø.ref.opkald_meldt,nr) then
                begin
                  if opkaldskø.ref(5) extract 4 <= 1 or
                     opk_alarm.tab.alarm_lgd = 0 then
                  begin
                    if type=2 then
                      write(z_op(nr),"bel",1,"del",8,"bel",1,"del",8,"bel",1)
                    else
                      write(z_op(nr),"bel",1);
                  end
                  else if type>kmdo then kmdo:= type;
                  sætbit_ia(opkaldskø.ref.opkald_meldt,nr,1);
                end;
              end;<* ant < 6 *>
            end;<* operatør ok *>
    
            ref:= opkaldskø.ref(1) extract 12;
            if ref = 0 and type = 2<*nød*> then ref:= første_opkald;
          end;
    \f

    message procedure skriv_skærm_opkaldskø side 2 - 820301/hko;
    
          signal_bin(bs_opkaldskø_adgang);
          if kmdo > opk_alarm.tab.alarm_tilst and 
             kmdo > opk_alarm.tab.alarm_kmdo  then
          begin
            opk_alarm.tab.alarm_kmdo:= kmdo;
            signal_bin(bs_opk_alarm);
          end;
          if ant > 5 then
          begin
            cursor(z_op(nr),13,9);
            write(z_op(nr),<<+ddd>,ant-5);
          end
          else
          begin
            for i:= ant +1 step 1 until 6 do
            begin
              cursor(z_op(nr),i*2+1,1);
              write(z_op(nr),"sp",25);
            end;
          end;
          ant_i_opkø(nr):= ant;
          cursor(z_op(nr),1,1);
    <*V*> setposition(z_op(nr),0,0);
        end skriv_skærm_opkaldskø;
    \f

    message procedure operatør side 2 - 810522/hko;
    
        trap(op_trap);
        stack_claim((if cm_test then 200 else 146)+24+48+80+175);
    
        ref:= nr*terminal_beskr_længde;
        tab:= (nr-1)*opk_alarm_tab_lgd;
        skærmmåde:= 0; <*normal*>
    
        if operatør_auto_include(nr) then
        begin
          waitch(cs_att_pulje,opref,true,-1);
          i:= operatør_auto_include(nr) extract 2;
          if i<>3 then i:= 0;
          start_operation(opref,101,cs_att_pulje,i shift 12 +1);
          d.opref.data(1):= nr;
          signalch(cs_rad,opref,gen_optype or io_optype);
        end;
    
    <*+2*>
        if testbit8 and overvåget or testbit28 then
          skriv_operatør(out,0);
    <*-2*>
    \f

    message procedure operatør side 3 - 810602/hko;
    
        repeat
    
    <*V*> wait_ch(cs_operatør(nr),
                  op_ref,
                  true,
                  -1<*timeout*>);
    <*+2*>
          if testbit9 and overvåget then
          disable begin
            write(out,"nl",1,<:operation fra cs:>,<<d>,cs_operatør(nr),
                             <: til operatør :>,nr);
            skriv_op(out,op_ref);
          end;
    <*-2*>
          monitor(8)reserve process:(z_op(nr),0,ia);
          kode:= d.op_ref.op_kode extract 12;
          i:= terminal_tab.ref.terminal_tilstand;
          status:= i shift(-21);
          opgave:=
            if kode=0 then 1 <* indlæs kommando *> else
            if kode=1 then 2 <* inkluder        *> else
            if kode=2 then 3 <* ekskluder       *> else
            if kode=40 then 4 <* opdater skærm  *> else
            if kode=43 then 5 <* opkald etableret *> else
            if kode=4  then 6 <* radiokanal ekskluderet *> else
            if kode=38 then 7 <* operatør meddelelse *> else
            0; <* afvises *>
    
          aktion:= case status +1 of(
    <* status        *> <* opgave:         0   1   2   3   4   5   6   7 *>
    <* 0 klar        *>(case opgave+1 of(  0,  1, -4,  3,  4, -4,  6,  7)),
    <* 1 samtale     *>(case opgave+1 of(  0,  1, -4, -5,  4, -4,  6,  7)),
    <* 2 optaget     *>(case opgave+1 of(  0,  1, -4, -5,  4,  5,  6,  7)),
    <* 3 stoppet     *>(case opgave+1 of(  0,  2,  2,  3, -4, -4, -4,  7)),
    <* 4 klar (fejl) *>(case opgave+1 of(  0, -4,  2,  3, -4, -4,  6, -4)),
    <* 5 samt.(fejl) *>(case opgave+1 of(  0, -4,  2,  3, -4, -4,  6, -4)),
    <* 6 opt. (fejl) *>(case opgave+1 of(  0, -4,  2,  3, -4,  5, -4, -4)),
    <* 7 ej knyttet  *>(case opgave+1 of(  0, -4,  2, -4, -4, -4, -4, -4)),
                        -1);
    \f

    message procedure operatør side 4 - 810424/hko;
    
          case aktion+6 of
          begin
            begin
              <*-5: terminal optaget *>
    
              d.op_ref.resultat:= 16;
              afslut_operation(op_ref,-1);
            end;
    
            begin
              <*-4: operation uden virkning *>
    
              afslut_operation(op_ref,-1);
            end;
    
            begin
              <*-3: ulovlig operationskode *>
    
              fejl_reaktion(2<*operationskode*>,kode,<:ulovlig:>,1);
              afslut_operation(op_ref,-1);
            end;
    
            begin
              <*-2: ulovligt operatørterminal_nr *>
    
              fejl_reaktion(3<*programfejl*>,nr,<: ikke eksisterende operatør:>,1);
              afslut_operation(op_ref,-1);
            end;
    
            begin
              <*-1: ulovlig operatørtilstand *>
    
              fejl_reaktion(3<*programfejl*>,status,<: ulovlig operatør-status:>,1);
              afslut_operation(op_ref,-1);
            end;
    
            begin
              <* 0: ikke implementeret *>
    
              fejl_reaktion(2<*operationskode*>,kode,<: ikke implementeret:>,1);
              afslut_operation(op_ref,-1);
            end;
    
            begin
    \f

    message procedure operatør side 5 - 851001/cl;
    
              <* 1: indlæs kommando *>
    
    
    <*V*>     læs_kommando(z_op(nr),200+nr,op_ref,pos,indeks,sep,sluttegn);
              if opk_alarm.tab.alarm_tilst > 0 then
              begin
                opk_alarm.tab.alarm_kmdo:= 3;
                signal_bin(bs_opk_alarm);
                pass;
              end;
              if d.op_ref.resultat > 3 then
              begin
    <*V*>       setposition(z_op(nr),0,0);
                cursor(z_op(nr),24,1);
                skriv_kvittering(z_op(nr),op_ref,pos,
                                 d.op_ref.resultat);
              end
              else if d.op_ref.resultat = -1 then
              begin
                skærmmåde:= 0;
                skrivskærm(nr);
              end
              else if d.op_ref.resultat>0 then
              begin <*godkendt*>
                kode:=d.op_ref.opkode;
                i:= kode extract 12;
                j:= if kode = 11 or kode = 12 then 1 <*VO,I/VO,U*> else
                    if kode = 19              then 1 <*VO,S     *> else
                    if kode = 20 or kode = 24 then 1 <*VO,F/VO,R*> else
                    if kode =  9 or kode = 10 then 2 <*VO,L/VO,B*> else
                    if kode =  6              then 4 <*STop*>      else
                    if 45<=kode and kode<=63  then 3 <*radiokom.*> else
                    if kode = 30              then 5 <*SP,D*>      else
                    if kode = 31              then 6 <*SP*>        else
                    if kode = 32 or kode = 33 then 7 <*SP,V/SP,O*> else
                    if kode = 34 or kode = 35 then 6 <*SP,R/SP,A*> else
                    if kode = 83              then 8 <*SL*>        else
                    if kode = 68              then 9 <*ST,D*>      else
                    if kode = 69              then 10 <*ST,V*>     else
                    if kode = 36              then 11 <*AL*>       else
                    if kode = 37              then 12 <*CC*>       else
                    if kode =  2              then 13 <*EX*>       else
                    if kode = 92              then 14 <*CQF,V*>    else
                    if kode = 38              then 15 <*AL,T*>     else
                       0;
                if j > 0 then
                begin
                  case j of
                  begin
                    begin
    \f

    message procedure operatør side 6 - 851001/cl;
    
                      <* 1 indsæt/udtag/flyt bus i vogntabel *>
    
                      vogn:=ia(1);
                      ll:=ia(2);
                      kanal:= if kode=11 or kode=19 then ia(3) else
                              if kode=12 then ia(2) else 0;
    <*V*>             wait_ch(cs_vt_adgang,
                              vt_op,
                              gen_optype,
                              -1<*timeout sek*>);
                      start_operation(vtop,200+nr,cs_operatør(nr),
                                      kode);
                      d.vt_op.data(1):=vogn;
                      if kode=11 or kode=19 or kode=20 or kode=24 then
                        d.vt_op.data(2):=ll;
                      if kode=19 then d.vt_op.data(3):= kanal else
                      if kode=11 or kode=12 then d.vt_op.data(4):= kanal;
                      indeks:= vt_op;
                      signal_ch(cs_vt,
                                vt_op,
                                gen_optype or op_optype);
    
    <*V*>             wait_ch(cs_operatør(nr),
                              vt_op,
                              op_optype,
                              -1<*timeout sek*>);
    <*+2*>            if testbit10 and overvåget then
                      disable begin
                        write(out,"nl",1,<:operatør :>,<<d>,nr,
                              <:: operation retur fra vt:>);
                        skriv_op(out,vt_op);
                      end;
    <*-2*>
    <*+4*>            if vt_op<>indeks then
                        fejl_reaktion(11<*fremmede op*>,op_ref,
                                      <:operatør-kommando:>,0);
    <*-4*>
    <*V*>             setposition(z_op(nr),0,0);
                      cursor(z_op(nr),24,1);
    <*V*>             skriv_kvittering(z_op(nr),if d.vt_op.resultat = 11 or
                        d.vt_op.resultat = 12 then d.vt_op.data(3)
                        else vt_op,-1,d.vt_op.resultat);
                      d.vt_op.optype:= gen_optype or vt_optype;
                      disable afslut_operation(vt_op,cs_vt_adgang);
                    end;
                    begin
    \f

    message procedure operatør side 7 - 810921/hko,cl;
    
                    <* 2 vogntabel,linienr/-,busnr *>
    
                    d.op_ref.retur:= cs_operatør(nr);
                    tofrom(d.op_ref.data,ia,10);
                    indeks:= op_ref;
                    signal_ch(cs_vt,op_ref,gen_optype or op_optype);
                    wait_ch(cs_operatør(nr),
                            op_ref,
                            op_optype,
                            -1<*timeout*>);
    <*+2*>          if testbit10 and overvåget then
                    disable begin
                      write(out,"nl",1,<:operatør operation retur fra vt:>);
                      skriv_op(out,op_ref);
                    end;
    <*-2*>
    <*+4*>
                    if indeks <> op_ref then
                      fejlreaktion(11<*fremmed post*>,op_ref,<:operatør komm:>,0);
    <*-4*>
                    i:= d.op_ref.resultat;
                    if i = 0 or i > 3 then
                    begin
    <*V*>             setposition(z_op(nr),0,0);
                      cursor(z_op(nr),24,1);
                      skriv_kvittering(z_op(nr),op_ref,-1,d.op_ref.resultat);
                    end
                    else
                    begin
                      integer antal,fil_ref;
    
                      skærm_måde:= 1;
                      antal:= d.op_ref.data(6);
                      fil_ref:= d.op_ref.data(7);
    <*V*>             setposition(z_op(nr),0,0);
                      write(z_op(nr),"esc" add 128,1,<:ÆH:>,"esc" add 128,1,<:ÆJ:>,
                        "sp",14,"*",10,"sp",6,
                            <:vogntabeludskrift:>,"sp",6,"*",10,"nl",2);
    <*V*>             setposition(z_op(nr),0,0);
    \f

    message procedure operatør side 8 - 841213/cl;
    
                      pos:= 1;
                      while pos <= antal do
                      begin
                        integer bogst,løb;
    
                        disable i:= læs_fil(fil_ref,pos,j);
                        if i <> 0 then
                          fejlreaktion(5<*læs_fil*>,i,<:operatør: vo,l/vo,b:>,0)
                        else
                        begin
                          vogn:= fil(j,1) shift (-24) extract 24;
                          løb:= fil(j,1) extract 24;
                          if d.op_ref.opkode=9 then
                            begin i:=vogn; vogn:=løb; løb:=i; end;
                          ll:= løb shift (-12) extract 10;
                          bogst:= løb shift (-7) extract 5;
                          if bogst > 0 then bogst:= bogst +'A'-1;
                          løb:= løb extract 7;
                          vogn:= vogn extract 14;
                          i:= d.op_ref.opkode-8;
                          for i:= i,i+1 do
                          begin
                            j:= (i+1) extract 1;
                            case j +1 of
                            begin
                              write(z_op(nr),"sp",(bogst=0) extract 1,<<ddd>,ll,
                                false add bogst,1,"/",1,<<d__>,løb);
                              write(z_op(nr),<<dddd>,vogn,"sp",1);
                            end;
                          end;
                          if pos mod 5 = 0 then
                          begin
                            outchar(z_op(nr),'nl');
    <*V*>                   setposition(z_op(nr),0,0);
                          end
                          else write(z_op(nr),"sp",3);
                        end;
                        pos:=pos+1;
                      end;
                      write(z_op(nr),"*",1,"nl",1);
    \f

    message procedure operatør side 8a- 810507/hko;
    
                      d.opref.opkode:=104; <*slet-fil*>
                      d.op_ref.data(4):=filref;
                      indeks:=op_ref;
                      signal_ch(cs_slet_fil,op_ref,gen_optype or op_optype);
    <*V*>             wait_ch(cs_operatør(nr),op_ref,op_optype,-1);
    
    <*+2*>            if testbit10 and overvåget then
                      disable begin
                        write(out,"nl",1,<:operatør, slet-fil retur:>);
                        skriv_op(out,op_ref);
                      end;
    <*-2*>
    
    <*+4*>            if op_ref<>indeks then
                        fejlreaktion(11<*fr.post*>,op_ref,<:operatør,slet-fil:>,0);
    <*-4*>
                      if d.op_ref.data(9)<>0 then
                        fejl_reaktion(3<*prg.fejl*>,d.op_ref.data(9),
                            <:operatør, slet_fil:>,1);
                    end;
                  end;
    
                  begin
    \f

    message procedure operatør side 9 - 830310/hko;
    
                      <* 3 radio_kommandoer *>
    
                      kode:= d.op_ref.opkode;
                      rkom:= kode-44; par1:=ia(1); par2:=ia(2);
                      disable if testbit14 then
                      begin
                        integer i; <*lav en trap-bar blok*>
    
                        trap(test14_trap);
                        systime(1,0,kommstart);
                        write(zrl,<<zd dd dd.dd >,now,<:op:>,<<d__>,nr,
                          string bpl_navn(nr),<: start :>,case rkom of (
                          <:OP:>,<:ME:>,<:OP,G:>,<:ME,G:>,<:OP,A:>,<:ME,A:>,
                          <:KA,C:>,<:KA,P:>,<:OP,L:>,<:MO:>,<:VE:>,<:NE:>,
                          <:OP,V:>,<:OP,T:>,<:R:>,<:GE:>,<:GE,G:>,<:GE,V:>,
                          <:GE,T:>),<: :>);
                        if (rkom<5 or rkom=9 or rkom=13 or rkom=14 or
                            rkom=16 or rkom=17 or rkom=19)
                        then
                        begin
                          if par1<>0 then skriv_id(zrl,par1,0);
                          if par2<>0 and rkom<>13 and rkom<>14 and rkom<>19 then
                            write(zrl,"sp",1,string områdenavn(par2));
                        end
                        else
                        if rkom=10 and par1<>0 then
                          write(zrl,string kanalnavn(par1 extract 20))
                        else
                        if rkom=5 or rkom=6 then
                        begin
                          if par1 shift (-20)=15 then write(zrl,<:ALLE:>) else
                          if par1 shift (-20)=14 then
                            write(zrl,string områdenavn(par1 extract 20));
                        end;
    test14_trap:        outchar(zrl,'nl');
                      end;
                      d.op_ref.data(4):= nr; <*operatør*>
                      opgave:=
                        if kode = 45 <*OP  *> then 1 else
                        if kode = 46 <*ME  *> then 2 else
                        if kode = 47 <*OP,G*> then 3 else
                        if kode = 48 <*ME,G*> then 4 else
                        if kode = 49 <*OP,A*> then 5 else
                        if kode = 50 <*ME,A*> then 6 else
                        if kode = 51 <*KA,C*> then 7 else
                        if kode = 52 <*KA,P*> then 8 else
                        if kode = 53 <*OP,L*> then 9 else
                        if kode = 54 <*MO  *> then (if ia(1)=0 then 11 else 10) else
                        if kode = 55 <*VE  *> then 14 else
                        if kode = 56 <*NE  *> then 12 else
                        if kode = 57 <*OP,V*> then  1 else
                        if kode = 58 <*OP,T*> then  1 else
                        if kode = 59 <*R   *> then 13 else
                        if kode = 60 <*GE  *> then 15 else
                        if kode = 61 <*GE,G*> then 16 else
                        if kode = 62 <*GE,V*> then 15 else
                        if kode = 63 <*GE,T*> then 15 else
                        -1;
    <*+4*>              if opgave < 0 then
                          fejlreaktion(2<*operationskode*>,kode,
                            <:operatør, radio-kommando :>,0);
    <*-4*>
                        status:= skærm_status(tilstand,b_v,b_s,b_s_tilst);
                        i:= d.op_ref.data(2):= ia(1); <* ident.*>
                        if 5<=opgave and opgave<=8 then
                          d.opref.data(2):= -1;
                        if opgave=13 then d.opref.data(2):=
                          (if læsbit_i(terminaltab.ref.terminaltilstand,11)
                           then 0 else 1);
                        if opgave = 14 then d.opref.data(2):= 1;
                        if opgave=7 or opgave=8 then 
                          d.opref.data(3):= -1
                        else
                        if opgave=5 or opgave=6 then
                        begin
                          if ia(1) shift (-20) = 15 then
                          begin
                            d.opref.data(3):= 15 shift 20;
                            for j:= 1 step 1 until max_antal_kanaler do
                            begin
                              iaf:= (j-1)*kanalbeskrlængde;
                              if læsbit_i(kanaltab.iaf.kanal_tilstand,11) and
                                 læsbit_i(ia(1),kanal_til_omr(j)) then
                                sætbit_i(d.opref.data(3),kanal_til_omr(j),1);
                            end;
                          end
                          else
                            d.opref.data(3):= if ia(1)=0 then 14 shift 20 + 3
                               else ia(1);
                        end
                        else
                        if kode = 57 then d.opref.data(3):= 2 else
                        if kode = 58 then d.opref.data(3):= 1 else
                        if kode = 62 then d.opref.data(3):= 2 else
                        if kode = 63 then d.opref.data(3):= 1 else
                                          d.opref.data(3):= ia(2);
    
                      <* !!! i første if-sætning nedenfor er 'status>1'
                             rettet til 'status>0' for at forhindre
                             at opkald nr. 2 kan udføres med et allerede
                             etableret opkald i skærmens s-felt,
                             jvf. ulykke d. 7/2-1995
                      !!! *>
                      res:=
                        if (opgave=1 or opgave=3) and status>0
                           then 16 <*skærm optaget*> else
                        if (opgave=15 or opgave=16) and
                           status>1 then 16 <*skærm optaget*> else
                        if (opgave=1 or opgave=3) and status=0 then 1 else
                        if (opgave=15 or opgave=16) and status=0 then 21 else
                        if (opgave=1 or opgave=3 or opgave=15 or opgave=16) then 
                           (if (d.opref.data(3)=1 or d.opref.data(3)=2) and
                              d.opref.data(3) = kanal_til_omr(bs extract 6)
                            then 52 else 1) else
                        if opgave<11 and status>0 then 16 else
                        if opgave=11 and status<2 then 21 else
                        if opgave=12 and status=0 then 22 else
                        if opgave=13 and status=0 then 49 else
                        if opgave=14 and status<>3 then 21 else 1;
                      if res=1 and (d.opref.data(3)=1 or d.opref.data(3)=2) then
                      begin <* specialbetingelser for TLF og VHF *>
                        if (1<opgave and opgave<9) or opgave=16 then res:= 51;
                      end;
                      if skærmmåde<>0 then
                        begin skærm_måde:= 0; skriv_skærm(nr); end;
                      kode:= opgave;
                      if opgave = 15 then opgave:= 1 else
                      if opgave = 16 then opgave:= 3;
    \f

    message procedure operatør side 10 - 810616/hko;
    
                      <* tilknyt talevej (om nødvendigt) *>
                      if res = 1 and op_talevej(nr)=0 then
                      begin
                        i:= sidste_tv_brugt;
                        repeat
                          i:= (i mod max_antal_taleveje)+1;
                          if tv_operatør(i)=0 then 
                          begin
                            tv_operatør(i):= nr;
                            op_talevej(nr):= i;
                          end;
                        until op_talevej(nr)<>0 or i=sidste_tv_brugt;
                        if op_talevej(nr)=0 then
                          res:=61
                        else
                        begin
                          sidste_tv_brugt:=
                            (sidste_tv_brugt mod max_antal_taleveje)+1;
    
    <*V*>                 waitch(cs_tvswitch_adgang,iaf,op_optype,-1);
                          start_operation(iaf,200+nr,cs_operatør(nr),
                                            'A' shift 12 + 44);
                          d.iaf.data(1):= op_talevej(nr);
                          d.iaf.data(2):= nr+16;
                          ll:= 0;
                          repeat
                            signalch(cs_talevejsswitch,iaf,op_optype);
    <*V*>                   waitch(cs_operatør(nr),iaf,op_optype,-1);
                            ll:= ll+1;
                          until ll=3 or d.iaf.resultat=3;
                          res:= if d.iaf.resultat=3 then 1 else 61;
    <* ********* *>
                          delay(1);
                          start_operation(iaf,200+nr,cs_operatør(nr),
                                            'R' shift 12 + 44);
                          ll:= 0;
                          repeat
                            signalch(cs_talevejsswitch,iaf,op_optype);
                            waitch(cs_operatør(nr),iaf,op_optype,-1);
                            ll:= ll+1;
                          until ll=3 or d.iaf.resultat=3;
    <* ********* *>
                          signalch(cs_tvswitch_adgang,iaf,op_optype);
                          if res<>1 then 
                            op_talevej(nr):=tv_operatør(op_talevej(nr)):= 0;
                        end;
                      end;
                      if op_talevej(nr)=0 then res:= 61;
                      d.op_ref.data(1):= op_talevej(nr);
    
                      if res <= 1 then
                      begin
    til_radio:          <* send operation til radiomodul *>
                        d.op_ref.opkode:= opgave shift 12 + 41;
                        d.op_ref.data(5):= if b_v<>0 then 12 shift 20 + b_v
                                           else 0;
                        d.op_ref.data(6):= b_s;
                        d.op_ref.resultat:=0;
                        d.op_ref.retur:= cs_operatør(nr);
                        indeks:= op_ref;
    <*+2*>              if testbit11 and overvåget then
                        disable begin
                          skriv_operatør(out,0);
                          write(out,<: operation til radio:>);
                          skriv_op(out,op_ref); ud;
                        end;
    <*-2*>
                        signal_ch(cs_rad,op_ref,gen_optype or op_optype);
    <*V*>               wait_ch(cs_operatør(nr),op_ref,op_optype,-1);
    
    <*+2*>              if testbit12 and overvåget then
                        disable begin
                          skriv_operatør(out,0);
                          write(out,<: operation retur fra radio:>);
                          skriv_op(out,op_ref); ud;
                        end;
    <*-2*>
    <*+4*>              if op_ref <> indeks then
                          fejlreaktion(11<*fr.post*>,op_ref,
                            <:operatør, retur fra radio:>,0);
    <*-4*>
    \f

    message procedure operatør side 11 - 810529/hko;
    
                        res:= d.op_ref.resultat;
                        if res < 2 or (res > 3 and (res<>49 or opgave<>11)) then
                        begin
    <*+4*>                if res < 2 then
                            fejlreaktion(3<*prg.fejl*>,res,
                              <: operatør,radio_op,resultat:>,1);
    <*-4*>
                          if res = 1 then res:= 0;
                          if (opgave < 10) and (res=20 or res=52) then
                              disable tæl_opkald_pr_operatør(nr,
                                (if res=20 then 4 else 5));
                        end
                        else
                        begin <* res = 2 eller 3 *>
                          s_kanal:= v_kanal:= 0;
                          opgave:= d.opref.opkode shift (-12);
                          bv:= d.op_ref.data(5) extract 4;
                          bs:= d.op_ref.data(6);
                          if opgave < 10 then
                          begin
                            j:= d.op_ref.data(7) <*type*>;
                            i:= terminal_tab.ref(1) shift (-12) shift 12 extract 21;
                            i:= i + (if opgave=2 or opgave>3 then 2 else 1);
                            terminal_tab.ref(1):= i
                              +(if res=2 then 4 <*optaget*> else 0)
                              +(if (opgave=1 or opgave=9) and j = 2 <*nødopkald*>
                                then 8 <*nød*> else 0)
                              +(if opgave=1 and j > 0 and j < 3 <*mobilopkald*>
                                then 16 else 0)
                              + (if opgave mod 2 = 0 then 64 <*pas*> else 0)
                              + (if opgave=9 then 128 else
                                 if opgave>=7 then 256 else
                                 if opgave>=5 then 512 else 0)
                              + (if res = 2 then 2 shift 21 <*tilstand = optaget *>
                                 else if b_s = 0 then 0     <*tilstand = ledig *>
                                            else 1 shift 21 <*tilstand = samtale*>);
                            if (res=3 and 0<=j and j<3) then
                              disable tæl_opkald_pr_operatør(nr,j+1);
                          end
                          else if opgave=10 <*monitering*> or
                                  opgave=14 <*ventepos  *> then
                          begin
    <*+4*>                  if res = 2 then
                              fejlreaktion(3<*prg.fejl*>,res,
                                <: operatør,moniter,res:>,1);
    <*-4*>
                            iaf:= (bs extract 4 -1)*kanal_beskr_længde;
                            i:= if bs<0 then
                              kanaltab.iaf.kanal_tilstand extract 12 else 0;
                            terminal_tab.ref(1):= i +
                              (if bs < 0 then (1 shift 21) else 0);
                            if opgave=10 then
                            begin
                              s_kanal:= bs;
                              v_kanal:= d.opref.data(5);
                            end;
    \f

    message procedure operatør side 12 - 810603/hko;
                          end
                          else if opgave=11 or opgave=12 then
                          begin
    <*+4*>                  if res = 2 then
                              fejlreaktion(3<*prg.fejl*>,res,
                                <: operatør,ge/ne,res:>,1);
    <*-4*>
                            if opgave=11 <*GE*> and res<>49 then
                            begin
                              s_kanal:= terminal_tab.ref(2);
                              v_kanal:= 12 shift 20 + 
                                (terminal_tab.ref(1) shift (-12) extract 4);
                            end;
                            terminal_tab.ref(1):= 0; <* s og v felt nedlagt *>
                          end
                          else
                          if opgave=13 then
                          begin
                            if res=2 then
                              fejlreaktion(3<*prg.fejl*>,res,
                                <:operatør,R,res:>,1);
                            sætbit_i(terminaltab.ref.terminaltilstand,11,
                              d.opref.data(2));
                          end
    <*+4*>                else fejlreaktion(3,opgave,<:operatør, opgave:>,0)
    <*-4*>
                          ;
                          <*indsæt kanal_nr for b_v_felt i terminalbeskr.*>
    
                          sæt_hex_ciffer(terminal_tab.ref,3,b_v extract 4);
                          terminal_tab.ref(2):= b_s;
                          terminal_tab.ref(3):= d.op_ref.data(11);
                          if (opgave<10 or opgave=14) and res=3 then
                            <*så henviser b_s til radiokanal*>
                          begin
                            if bs shift (-20) = 12 then
                            begin
                              iaf:= (bs extract 4 -1)*kanal_beskr_længde;
                              kanaltab.iaf.kanal_tilstand:=
                                kanaltab.iaf.kanal_tilstand shift(-10) shift 10
                                +terminal_tab.ref(1) extract 10;
                            end
                            else
                            begin
                              for i:= 1 step 1 until max_antal_kanaler do
                              begin
                                if læsbit_i(bs,i) then
                                begin
                                  iaf:= (i-1)*kanal_beskr_længde;
                                  kanaltab.iaf.kanaltilstand:=
                                    kanaltab.iaf.kanaltilstand shift (-10) shift 10
                                    + terminal_tab.ref(1) extract 10;
                                end;
                              end;
                            end;
                          end;
                          if kode=15 or kode=16 then
                          begin
                            if opgave<10 then
                            begin
                              opgave:= 11;
                              kanal:= (12 shift 20) +
                                      d.opref.data(6) extract 20;
                              goto til_radio;
                            end
                            else
                            if opgave=11 then
                            begin
                              opgave:= 10;
                              d.opref.data(2):= kanal;
                              goto til_radio;
                            end;
                          end
                          else
                          if (kode=1 or kode=3) then
                          begin
                            if opgave<10 and bv<>0 then
                            begin
                              opgave:= 14;
                              d.opref.data(2):= 2;
                              goto til_radio;
                            end;
                          end;
    <*V*>                 skriv_skærm_b_v_s(nr);
    <*V*>                 if sætbit_ia(opkaldsflag,nr,0) = 1 then
                            skriv_skærm_opkaldskø(nr);
                          for i:= s_kanal, v_kanal do
                            if i<0 then skriv_skærm_kanal(nr,i extract 4);
                          tofrom(kanalflag,alle_operatører,op_maske_lgd);
                          signalbin(bs_mobilopkald);
    <*V*>                 setposition(z_op(nr),0,0);
                        end; <* res = 2 eller 3 *>
                      end; <* res <= 1 *>
                      <* frigiv talevej (om nødvendigt) *>
                      if læs_hex_ciffer(terminal_tab.ref,3,b_v)=0
                         and terminal_tab.ref(2)=0 <*b_s*>
                         and op_talevej(nr)<>0
                      then
                      begin
    <*V*>               waitch(cs_tvswitch_adgang,iaf,op_optype,-1);
                        start_operation(iaf,200+nr,cs_operatør(nr),
                                            'D' shift 12 + 44);
                        d.iaf.data(1):= op_talevej(nr);
                        d.iaf.data(2):= nr+16;
                        ll:= 0;
                        repeat
                          signalch(cs_talevejsswitch,iaf,op_optype);
    <*V*>                 waitch(cs_operatør(nr),iaf,op_optype,-1);
                          ll:= ll+1;
                        until ll=3 or d.iaf.resultat=3;
                        ll:= d.iaf.resultat;
                        signalch(cs_tvswitch_adgang,iaf,op_optype);
                        if ll<>3 then 
                          fejlreaktion(21,op_talevej(nr)*100+nr,
                            <:frigiv operatør fejlet:>,1)
                        else
                          op_talevej(nr):= tv_operatør(op_talevej(nr)):= 0;
                        skriv_skærm_b_v_s(nr);
                      end;
                      disable if testbit14 then
                      begin
                        integer t; <*lav en trap-bar blok*>
    
                        trap(test14_trap);
                        systime(1,0,kommslut);
                        write(zrl,<<zd dd dd.dd >,now,<:op:>,<<d__>,nr,
                          string bpl_navn(nr),<:  slut :>,case rkom of (
                          <:OP:>,<:ME:>,<:OP,G:>,<:ME,G:>,<:OP,A:>,<:ME,A:>,
                          <:KA,C:>,<:KA,P:>,<:OP,L:>,<:MO:>,<:VE:>,<:NE:>,
                          <:OP,V:>,<:OP,T:>,<:R:>,<:GE:>,<:GE,G:>,<:GE,V:>,
                          <:GE,T:>),<: :>);
                        if (rkom<5 or rkom=9 or rkom=13 or rkom=14 or
                            rkom=16 or rkom=17 or rkom=19)
                        then
                        begin
                          if d.opref.data(7)=2 then outchar(zrl,'*');
                          if d.opref.data(9)<>0 then 
                          begin
                            skriv_id(zrl,d.opref.data(9),0);
                            outchar(zrl,' ');
                          end;
                          if d.opref.data(8)<>0 then
                          begin
                            skriv_id(zrl,d.opref.data(8),0);
                            outchar(zrl,' ');
                          end;
                          if d.opref.data(8)=0 and d.opref.data(9)=0 and
                             d.opref.data(2)<>0 then
                          begin
                            skriv_id(zrl,d.opref.data(2),0);
                            outchar(zrl,' ');
                          end;
                          if d.opref.data(12)<>0 then
                          begin
                            if d.opref.data(12) shift (-20) = 15 then
                              write(zrl,<:OMR*:>)
                            else
                            if d.opref.data(12) shift (-20) = 14 then
                              write(zrl,
                                string områdenavn(d.opref.data(12) extract 20))
                            else
                              skriv_id(zrl,d.opref.data(12),0);
                            outchar(zrl,' ');
                          end;
                          t:= terminal_tab.ref.terminaltilstand extract 10;
                          if res=3 and rkom=1 and
                             (t shift (-4) extract 1 = 1) and
                             (t extract 2 <> 3)
                          then
                          begin
                            iaf:= (terminal_tab.ref(2) extract 20 - 1)*
                                  kanal_beskr_længde;
                            write(zrl,<<zd.dd>,(kanal_tab.iaf.kanal_spec
                                    extract 12)/100," ",1);
                          end;
                          if d.opref.data(10)<>0 then
                          begin
                            skriv_id(zrl,d.opref.data(10),0);
                            outchar(zrl,' ');
                          end;
                        end
                        else
                        if rkom=10 and par1<>0 then
                          write(zrl,string kanalnavn(par1 extract 20),"sp",1)
                        else
                        if rkom=5 or rkom=6 then
                        begin
                          if par1 shift (-20)=15 then write(zrl,<:ALLE:>) else
                          if par1 shift (-20)=14 then
                            write(zrl,string områdenavn(par1 extract 20));
                          outchar(zrl,' ');
                        end;
                        if op_talevej(nr) > 0 then
                            write(zrl,<:T:>,<<d>,op_talevej(nr)," ",1);
                        write(zrl,<:res=:>,<<d>,res,<: btid=:>,
                          <<dd.dd>,kommslut-kommstart);
    test14_trap:        outchar(zrl,'nl');   
                      end;
    
    <*V*>             setposition(z_op(nr),0,0);
                      cursor(z_op(nr),24,1);
    <*V*>             skriv_kvittering(z_op(nr),op_ref,-1,res);
                    end; <* radio-kommando *>
                    begin
    \f

    message procedure operatør side 13 - 810518/hko;
    
                      <* 4 stop kommando *>
    
                      status:= skærm_status(tilstand,b_v,b_s,b_s_tilst);
                      if tilstand <> 0 then
                      begin
                        d.op_ref.resultat:= 16; <*skærm optaget*>
                      end
                      else
                      begin
                        d.op_ref.retur:= cs_operatør(nr);
                        d.op_ref.resultat:= 0;
                        d.op_ref.data(1):= nr;
                        indeks:= op_ref;
    <*+2*>              if testbit11 and overvåget then
                        disable begin
                          skriv_operatør(out,0);
                          write(out,<: stop_operation til radio:>);
                          skriv_op(out,op_ref); ud;
                        end;
    <*-2*>
                        if opk_alarm.tab.alarm_tilst > 0 then
                        begin
                          opk_alarm.tab.alarm_kmdo:= 3;
                          signal_bin(bs_opk_alarm);
                        end;
    
                        signal_ch(cs_rad,op_ref,gen_optype or op_optype);
    <*V*>               wait_ch(cs_operatør(nr),op_ref,op_optype,-1);
    <*+2*>              if testbit12 and overvåget then
                        disable begin
                          skriv_operatør(out,0);
                          write(out,<: operation retur fra radio:>);
                          skriv_op(out,op_ref); ud;
                        end;
    <*-2*>
    <*+4*>              if indeks <> op_ref then
                          fejlreaktion(11<*fr.post*>,op_ref,
                            <: operatør, retur fra radio:>,0);
    <*-4*>
    \f

    message procedure operatør side 14 - 810527/hko;
    
                        if d.op_ref.resultat = 3 then
                        begin
                          integer k,n;
                          integer array field msk,iaf1;
    
                          terminal_tab.ref.terminal_tilstand:= 3 shift 21
                            +terminal_tab.ref.terminal_tilstand extract 21;
                          tofrom(opkaldsflag,alle_operatører,op_maske_lgd);
                          if sæt_bit_ia(operatørmaske,nr,0)=1 then
                          for k:= nr, 65 step 1 until top_bpl_gruppe do
                          begin
                            msk:= k*op_maske_lgd;
                            if læsbit_ia(bpl_def.msk,nr) then 
    <**>                    begin
                              n:= 0;
                              for i:= 1 step 1 until max_antal_operatører do
                              if læsbit_ia(bpl_def.msk,i) then
                              begin
                                iaf1:= i*terminal_beskr_længde;
                                if terminal_tab.iaf1.terminal_tilstand 
                                                             shift (-21) < 3 then
                                  n:= n+1;
                              end;  
                              bpl_tilst(k,1):= n;
                            end;
    <**> <*  
                              bpl_tilst(k,1):= bpl_tilst(k,1)-1;
      *>                  end;
                          signal_bin(bs_mobil_opkald);
    <*V*>                 setposition(z_op(nr),0,0);
                          ht_symbol(z_op(nr));
                        end;
                      end;
    <*V*>             setposition(z_op(nr),0,0);
                      cursor(z_op(nr),24,1);
                      if d.op_ref.resultat<> 3 then
                        skriv_kvittering(z_op(nr),op_ref,-1,d.op_ref.resultat);
                    end;
                    begin
                      boolean l22;
    \f

    message procedure operatør side 15 - 810521/cl;
    
                      <* 5 springdefinition *>
                      l22:= false;
                      if sep=',' then
                      disable begin
                        setposition(z_op(nr),0,0);
                        cursor(z_op(nr),22,1);
                        write(z_op(nr),"esc" add 128,1,<:ÆK:>,">",1);
                        l22:= true; pos:= 1;
                        while læstegn(d.op_ref.data,pos,i)<>0 do
                          outchar(z_op(nr),i);
                      end;
    
                      tofrom(d.op_ref.data,ia,indeks*2);
    <*V*>             wait_ch(cs_op_fil(nr),vt_op,true,-1<*timeout*>);
                      start_operation(vt_op,200+nr,cs_operatør(nr),
                                      101<*opret fil*>);
                      d.vt_op.data(1):=128;<*postantal*>
                      d.vt_op.data(2):=2;  <*postlængde*>
                      d.vt_op.data(3):=1;  <*segmentantal*>
                      d.vt_op.data(4):=
                              2 shift 10;  <*spool fil*>
                      signal_ch(cs_opret_fil,vt_op,op_optype);
                      pos:=vt_op;<*variabel lånes*>
    <*V*>             wait_ch(cs_operatør(nr),vt_op,op_optype,-1<*timeout*>);
    <*+4*>            if vt_op<>pos then
                        fejlreaktion(11<*fremmed post*>,vt_op,<:springdef:>,0);
                      if d.vt_op.data(9)<>0 then
                        fejlreaktion(13<*opret-fil*>,d.vt_op.data(9),
                          <:op kommando(springdefinition):>,0);
    <*-4*>
                      iaf:=0;
                      for i:=1 step 1 until indeks-2 do
                      begin
                        disable k:=modif_fil(d.vt_op.data(4),i,j);
                        if k<>0 then
                          fejlreaktion(7<*modif-fil*>,k,
                            <:op kommando(spring-def):>,0);
                        fil(j).iaf(1):=d.op_ref.data(i+2);
                      end;
    \f

    message procedure operatør side 15a - 820301/cl;
    
                      while sep = ',' do
                      begin
                        setposition(z_op(nr),0,0);
                        cursor(z_op(nr),23,1);
                        write(z_op(nr),"esc" add 128,1,<:ÆK:>,<:+>:>);
                        setposition(z_op(nr),0,0);
                        wait(bs_fortsæt_adgang);
                        pos:= 1; j:= 0;
                        while læs_store(z_op(nr),i) < 8 do
                        begin
                          skrivtegn(fortsæt,pos,i);
                          if i = '?' or i = 'esc' then j:= 1; <* skip kommando *>
                        end;
                        skrivtegn(fortsæt,pos,'em');
                        afsluttext(fortsæt,pos);
                        sluttegn:= i;
                        if j<>0 then
                        begin
                          setposition(z_op(nr),0,0);
                          cursor(z_op(nr),24,1);
                          skriv_kvittering(z_op(nr),opref,-1,53);<*annulleret*>
                          cursor(z_op(nr),1,1);
                          goto sp_ann;
                        end;
    \f

    message procedure operatør side 16 - 810521/cl;
    
                        disable begin
                        integer array værdi(1:4);
                        integer a_pos,res;
                          pos:= 0;
                          repeat
                            apos:= pos;
                            læs_paramsæt(fortsæt,a_pos,0,værdi,sep,res);
                            if res >= 0 then
                            begin
                              if res=0 and (sep=',' or indeks>2) then <*ok*>
                              else if res=0 then res:= -25 <*parameter mangler*>
                              else if res=10 and (værdi(1)<1 or værdi(1)>99) then
                                  res:= -44 <*intervalstørrelse ulovlig*>
                              else if res=10 and (værdi(2)<1 or værdi(2)>99) then
                                  res:= -6  <*løbnr ulovligt*>
                              else if res=10 then
                              begin
                                k:=modiffil(d.vt_op.data(4),indeks-1,j);
                                if k<>0 then fejlreaktion(7<*modiffil*>,k,
                                   <:op kommando(spring-def):>,0);
                                iaf:= 0;
                                fil(j).iaf(1):= værdi(1) shift 12 + værdi(2);
                                indeks:= indeks+1;
                                if sep = ',' then res:= 0;
                              end
                              else res:= -27; <*parametertype*>
                            end;
                            if res>0 then pos:= a_pos;
                          until sep<>'sp' or res<=0;
    
                          if res<0 then
                          begin
                            d.op_ref.resultat:= -res;
                            i:=1; j:= 1;
                            hægt_tekst(d.op_ref.data,i,fortsæt,j);
                            afsluttext(d.op_ref.data,i);
                          end;
                        end;
    \f

    message procedure operatør side 17 - 810521/cl;
    
                        if d.op_ref.resultat > 3 then
                        begin
                          setposition(z_op(nr),0,0);
                          if l22 then
                          begin
                            cursor(z_op(nr),22,1); l22:= false;
                            write(z_op(nr),"-",80);
                          end;
                          cursor(z_op(nr),24,1);
                          skriv_kvittering(z_op(nr),op_ref,pos,d.opref.resultat);
                          goto sp_ann;
                        end;
                        if sep=',' then
                        begin
                          setposition(z_op(nr),0,0);
                          cursor(z_op(nr),22,1);
                          write(z_op(nr),"esc" add 128,1,<:ÆK:>,<:+>:>);
                          pos:= 1; l22:= true;
                          while læstegn(fortsæt,pos,i)<>0 do
                            outchar(z_op(nr),i);
                        end;
                        signalbin(bs_fortsæt_adgang);
                      end while sep = ',';
                      d.vt_op.data(1):= indeks-2;
                      k:= sætfildim(d.vt_op.data);
                      if k<>0 then fejlreaktion(9,k,<:op kommando(spring-def):>,0);
                      d.op_ref.data(3):= d.vt_op.data(4); <*filref*>
                      signalch(cs_op_fil(nr),vt_op,op_optype or gen_optype);
                      d.op_ref.retur:=cs_operatør(nr);
                      pos:=op_ref;
                      signal_ch(cs_vt,op_ref,gen_optype or op_optype);
    <*V*>             wait_ch(cs_operatør(nr),op_ref,op_optype,-1<*timeout*>);
    <*+4*>            if pos<>op_ref then
                        fejlreaktion(11<*fremmed post*>,op_ref,
                          <:op kommando(springdef retur fra vt):>,0);
    <*-4*>
    \f

    message procedure operatør side 18 - 810521/cl;
    
    <*V*>             setposition(z_op(nr),0,0);
                      if l22 then
                      begin
                        cursor(z_op(nr),22,1);
                        write(z_op(nr),"-",80);
                      end;
                      cursor(z_op(nr),24,1);
                      skriv_kvittering(z_op(nr),op_ref,-1,d.op_ref.resultat);
    
                      if false then
                      begin
              sp_ann:   signalch(cs_slet_fil,vt_op,op_optype);
                        waitch(cs_operatør(nr),vt_op,op_optype,-1);
                        signalch(cs_op_fil(nr),vt_op,op_optype or vt_optype);
                        signalbin(bs_fortsæt_adgang);
                      end;
                        
                    end;
    
                    begin
    \f

    message procedure operatør side 19 - 810522/cl;
    
                      <* 6 spring  (igangsæt)
                           spring,annuler
                           spring,reserve     *>
    
                      tofrom(d.op_ref.data,ia,6);
                      d.op_ref.retur:=cs_operatør(nr);
                      indeks:=op_ref;
                      signal_ch(cs_vt,op_ref,gen_optype or op_optype);
    <*V*>             wait_ch(cs_operatør(nr),
                              op_ref,
                              op_optype,
                              -1<*timeout*>);
    <*+2*>            if testbit10 and overvåget then
                      disable begin
                        skriv_operatør(out,0);
                        write(out,"nl",1,<:op operation retur fra vt:>);
                        skriv_op(out,op_ref);
                      end;
    <*-2*>
    <*+4*>            if indeks<>op_ref then
                        fejlreaktion(11<*fremmed post*>,op_ref,
                                     <:op kommando(spring):>,0);
    <*-4*>
    
    <*V*>             setposition(z_op(nr),0,0);
                      cursor(z_op(nr),24,1);
                      skriv_kvittering(z_op(nr),if (d.op_ref.resultat=11 or
                          d.op_ref.resultat=12) and kode=34 <*SP,R*> then
                          d.op_ref.data(4) else op_ref,-1,d.op_ref.resultat);
                    end;
    
                    begin
    \f

    message procedure operatør side 20 - 810525/cl;
    
                      <* 7 spring(-oversigts-)rapport *>
    
                      d.op_ref.retur:=cs_operatør(nr);
                      tofrom(d.op_ref.data,ia,4);
                      indeks:=op_ref;
                      signal_ch(cs_vt,op_ref,gen_optype or op_optype);
    <*V*>             wait_ch(cs_operatør(nr),op_ref,op_optype,-1<*timeout*>);
    <*+2*>            disable if testbit10 and overvåget then
                      begin
                        write(out,"nl",1,<:operatør operation retur fra vt:>);
                        skriv_op(out,op_ref);
                      end;
    <*-2*>
    
    <*+4*>            if op_ref<>indeks then
                        fejlreaktion(11<*fremmed post*>,op_ref,
                          <:op kommando(spring-rapport):>,0);
    <*-4*>
    
    <*V*>             setposition(z_op(nr),0,0);
                      if d.op_ref.resultat<>3 then
                      begin
                        cursor(z_op(nr),24,1);
                        skriv_kvittering(z_op(nr),op_ref,-1,d.op_ref.resultat);
                      end
                      else
                      begin
                        boolean p_skrevet;
                        integer bogst,løb;
    
                        skærmmåde:= 1;
    
                        if kode = 32 then <* spring,vis *>
                        begin
                          ll:= d.op_ref.data(1) shift (-5) extract 10;
                          bogst:= d.op_ref.data(1) extract 5;
                          if bogst<>0 then bogst:= bogst + 'A' - 1;
    <*V*>                 write(z_op(nr),"esc" add 128,1,<:ÆH:>,
                            "esc" add 128,1,<:ÆJ:>,"sp",10,"*",5,"sp",5,
                            <:spring: :>,
                            <<d>,ll,false add bogst,(bogst<>0) extract 1,
                            <:.:>,string (extend d.op_ref.data(2) shift 24));
                          raf:= data+8;
                          if d.op_ref.raf(1)<>0.0 then
                            write(z_op(nr),<:, startet :>,<<zddddd>,
                              round systime(4,d.op_ref.raf(1),r),<:.:>,round r)
                          else write(z_op(nr),<:, ikke startet:>);
                          write(z_op(nr),"sp",5,"*",5,"nl",2);
    \f

    message procedure operatør side 21 - 810522/cl;
    
                          p_skrevet:= false;
                          for pos:=1 step 1 until d.op_ref.data(3) do
                          begin
                            disable i:=læsfil(d.op_ref.data(4),pos,j);
                            if i<>0 then
                              fejlreaktion(5<*læsfil*>,i,
                                <:op kommando(spring,vis):>,0);
                            iaf:=0;
                            i:= fil(j).iaf(1);
                            if i < 0 and -, p_skrevet then
                            begin
                              outchar(z_op(nr),'('); p_skrevet:= true;
                            end;
                            if i > 0 and p_skrevet then
                            begin
                              outchar(z_op(nr),')'); p_skrevet:= false;
                            end;
                            if pos mod 2 = 0 then
                              write(z_op(nr),<< dd>,abs i,<:.:>)
                            else
                              write(z_op(nr),true,3,<<d>,abs i);
                            if pos mod 21 = 0 then outchar(z_op(nr),'nl');
                          end;
                          write(z_op(nr),"*",1);
    \f

    message procedure operatør side 22 - 810522/cl;
    
                        end
                        else if kode=33 then <* spring,oversigt *>
                        begin
                          write(z_op(nr),"esc" add 128,1,<:ÆH:>,
                            "esc" add 128,1,<:ÆJ:>,"sp",10,"*",5,"sp",5,
                            <:spring oversigt:>,"sp",5,"*",5,"nl",2);
    
                          for pos:=1 step 1 until d.op_ref.data(1) do
                          begin
                            disable i:=læsfil(d.op_ref.data(2),pos,j);
                            if i<>0 then 
                              fejlreaktion(5<*læsfil*>,i,
                                <:op kommando(spring-oversigt):>,0);
                            iaf:=0;
                            ll:=fil(j).iaf(1) shift (-5) extract 10;
                            bogst:=fil(j).iaf(1) extract 5;
                            if bogst<>0 then bogst:=bogst + 'A' - 1;
                            write(z_op(nr),"sp",(bogst=0) extract 1 + 1,<<ddd>,ll,
                              false add bogst,(bogst<>0) extract 1,<:.:>,true,4,
                              string (extend fil(j).iaf(2) shift 24));
                            if fil(j,2)<>0.0 then
                              write(z_op(nr),<:startet :>,<<zddddd>,
                                round systime(4,fil(j,2),r),<:.:>,round r);
                            outchar(z_op(nr),'nl');
                          end;
                          write(z_op(nr),"*",1);
                        end;
                        <* slet fil *>
                        d.op_ref.opkode:= 104;
                        if kode=33 then d.op_ref.data(4):= d.op_ref.data(2);
                        signalch(cs_slet_fil,op_ref,gen_optype or op_optype);
                        waitch(cs_operatør(nr),op_ref,op_optype or gen_optype,-1);
                      end; <* resultat=3 *>
    
                    end;
    
                    begin
    \f

    message procedure operatør side 23 - 940522/cl;
    
    
                      <* 8 SLUT *>
                      trapmode:= 1 shift 13;
                      trap(-2);
                    end;
    
                    begin
                      <* 9 stopniveauer,definer *>
                      integer fno;
    
                      for i:= 1 step 1 until 3 do
                        operatør_stop(nr,i):= ia(i+1);
                      i:= modif_fil(tf_stoptabel,nr,fno);
                      if i<>0 then fejlreaktion(7,i,<:stoptabel:>,0);
                      iaf:=0;
                      for i:= 0,1,2,3 do
                        fil(fno).iaf(i+1):= operatør_stop(nr,i);
                      setposition(fil(fno),0,0);
                      setposition(z_op(nr),0,0);
                      cursor(z_op(nr),24,1);
                      skriv_kvittering(z_op(nr),0,-1,3);
                    end;
    
                    begin
    \f

    message procedure operatør side 24 - 940522/cl;
                      
                      <* 10 stopniveauer,vis *>
                      integer bpl,j,k;
    
                      skærm_måde:= 1;
                      setposition(z_op(nr),0,0);
                      write(z_op(nr),"esc" add 128,1,<:ÆH:>,"esc" add 128,1,<:ÆJ:>,
                        <:stopniveauer: :>);
                      for i:= 0 step 1 until 3 do
                      begin
                        bpl:= operatør_stop(nr,i);
                        write(z_op(nr),if i=0 then <:  :> else <: -> :>,
                          if bpl=0 then <:ALLE:> else string bpl_navn(bpl));
                      end;
                      write(z_op(nr),"nl",2,<:operatørpladser:  :>);
                      j:=0;
                      for bpl:= 1 step 1 until max_antal_operatører do
                      if bpl_navn(bpl)<>long<::> then
                      begin
                        if j mod 8 = 0 and j > 0 then
                          write(z_op(nr),"nl",1,"sp",18);
                        iaf:= bpl*terminal_beskr_længde;
                        write(z_op(nr),if bpl_tilst(bpl,1) > 0 then "*" else " ",1,
                          true,6,string bpl_navn(bpl));
                        j:=j+1;
                      end;
                      write(z_op(nr),"nl",2,<:operatørgrupper:   :>);
                      j:=0;
                      for bpl:= 65 step 1 until top_bpl_gruppe do
                      if bpl_navn(bpl)<>long<::> then
                      begin
                        if j mod 8 = 0 and j > 0 then
                          write(z_op(nr),"nl",1,"sp",19);
                        write(z_op(nr),true,7,string bpl_navn(bpl));
                        j:=j+1;
                      end;
                      write(z_op(nr),"nl",1,"*",1);
                    end;
    
                    begin
                      <* 11 alarmlængde *>
                      integer fno;
    
                      if indeks > 0 then
                      begin
                        opk_alarm.tab.alarm_lgd:= ia(1);
                        i:= modiffil(tf_alarmlgd,nr,fno);
                        if i<>0 then fejlreaktion(7,i,<:alarmlgd:>,0);
                        iaf:= 0;
                        fil(fno).iaf(1):= opk_alarm.tab.alarm_lgd;
                        setposition(fil(fno),0,0);
                      end;
    
                      setposition(z_op(nr),0,0);
                      cursor(z_op(nr),24,1);
                      skriv_kvittering(z_op(nr),opk_alarm.tab.alarm_lgd,-1,63);
                    end;                  
    
                    begin
                      <* 12 CC *>
                      integer i, c;
    
                      i:= 1;
                      while læstegn(ia,i+0,c)<>0 and
                         i<(op_spool_postlgd-op_spool_text)//2*3
                      do skrivtegn(d.opref.data,i,c);
                      repeat skrivtegn(d.opref.data,i,0) until (i mod 6)=1;
    
                      d.opref.retur:= cs_operatør(nr);
                      signalch(cs_op_spool,opref,op_optype);
    <*V*>             waitch(cs_operatør(nr),opref,op_optype,-1);
                                                           
                      setposition(z_op(nr),0,0);
                      cursor(z_op(nr),24,1);
                      skriv_kvittering(z_op(nr),opref,-1,d.opref.resultat);
                    end;
    
                    <* 13 EXkluder skærmen *>
                    begin
                      d.opref.resultat:= 2;
                      setposition(z_op(nr),0,0);
                      cursor(z_op(nr),24,1);
                      skriv_kvittering(z_op(nr),opref,-1,d.opref.resultat);
    
                      waitch(cs_op_fil(nr),vt_op,true,-1);
                      start_operation(vt_op,curr_coruid,cs_op_fil(nr),2);
                      d.vt_op.data(1):= nr;
                      signalch(cs_rad,vt_op,gen_optype);
                    end;
    
                    begin
                      <* 14 CQF-tabel,vis *>
    
                      skærm_måde:= 1;
                      setposition(z_op(nr),0,0);
                      write(z_op(nr),"esc" add 128,1,<:ÆH:>,
                        "esc" add 128,1,<:ÆJ:>);
                      skriv_cqf_tabel(z_op(nr),false);
                      write(z_op(nr),"*",1);
                    end;
    
                    begin
                      <* 15 ALarmlyd,Test *>
                      integer array field tab;
                      integer res;
    
                      tab:= (nr-1)*opk_alarm_tab_lgd;
                      setposition(z_op(nr),0,0);
                      if ia(1)<1 or ia(1)>2 then
                        res:= 64 <* ulovligt tal *>
                      else if opk_alarm.tab.alarm_lgd = 0 then
                      begin
                        if ia(1)=2 then
                          write(z_op(nr),"bel",1,"del",8,"bel",1,"del",8,"bel",1)
                        else
                          write(z_op(nr),"bel",1);
                        res:= 3;
                      end
                      else if ia(1) > opk_alarm.tab.alarm_tilst and
                              ia(1) > opk_alarm.tab.alarm_kmdo  then
                      begin
                        opk_alarm.tab.alarm_kmdo:= ia(1);
                        signal_bin(bs_opk_alarm);
                        res:= 3;
                      end
                      else
                        res:= 48; <* i brug *>
    
                      cursor(z_op(nr),24,1);
                      skriv_kvittering(z_op(nr),opref,-1,res);
                    end;   
    
                    begin
                      d.op_ref.resultat:= 45; <*ikke implementeret*>
                      setposition(z_op(nr),0,0);
                      cursor(z_op(nr),24,1);
                      skriv_kvittering(z_op(nr),op_ref,-1,d.op_ref.resultat);
                    end;
    \f

    message procedure operatør side x - 810522/hko;
    
    <*+4*>          fejl_reaktion(3<*programfejl*>,j,<:case 'opkode':>,2)
    <*-4*>
                  end;<*case j *>
                end <* j > 0 *>
                else
                begin
    <*V*>         setposition(z_op(nr),0,0);
                  if sluttegn<>'nl' then outchar(z_op(nr),'nl');
                  skriv_kvittering(z_op(nr),op_ref,-1,
                                   45 <*ikke implementeret *>);
                end;
              end;<* godkendt *>
    
    <*V*>     setposition(z_op(nr),0,0);
    <*???*>
             while (læsbit_ia(samtaleflag,nr) or læsbit_ia(opkaldsflag,nr) or
               læsbit_ia(kanalflag,nr) ) and læsbit_ia(operatørmaske,nr) and
               skærmmåde = 0 do
             begin
              if sætbit_ia(samtaleflag,nr,0)=1 then
              begin
                skriv_skærm_bvs(nr);
    <*940920    if op_talevej(nr)=0 then status:= 0
                else inspect(bs_talevej_udkoblet(op_talevej(nr)),status);
                if status>0 then
                begin
                  for ll:= 1 step 1 until terminalbeskrlængde//2 do
                    terminaltab.ref(ll):= 0;
                  skriv_skærm_bvs(nr);
                  wait(bs_talevej_udkoblet(op_talevej(nr)));
                end;
                for i:= 1 step 1 until max_antal_kanaler do
                begin
                  iaf:= (i-1)*kanalbeskrlængde;
                  inspect(ss_samtale_nedlagt(i),status);
                  if status>0 and 
                    tv_operatør(kanaltab.iaf.kanal_tilstand shift (-16))=nr then
                  begin
                    kanaltab.iaf.kanal_tilstand:=
                      kanaltab.iaf(1) shift (-10) extract 6 shift 10;
                    for ll:= 2 step 1 until kanalbeskrlængde//2 do
                      kanaltab.iaf(ll):= 0;
                    skriv_skærm_kanal(nr,i);
                    repeat
                      wait(ss_samtale_nedlagt(i));
                      inspect(ss_samtale_nedlagt(i),status);
                    until status=0;
                  end;
                end;
    940920*>    cursor(z_op(nr),1,1);
                setposition(z_op(nr),0,0);
              end;
              if (læsbit_ia(opkaldsflag,nr) or læsbit_ia(kanalflag,nr))
                 and skærmmåde = 0
                 and læsbit_ia(operatørmaske,nr) then
              begin
                if sætbit_ia(opkaldsflag,nr,0) = 1 then
                  skriv_skærm_opkaldskø(nr);
                if sætbit_ia(kanalflag,nr,0) = 1 then
                begin
                  for i:= 1 step 1 until max_antal_kanaler do
                    skriv_skærm_kanal(nr,i);
                end;
                cursor(z_op(nr),1,1);
    <*V*>       setposition(z_op(nr),0,0);
              end;
             end;
              d.op_ref.retur:=cs_att_pulje;
              disable afslut_kommando(op_ref);
            end; <* indlæs kommando *>
    
            begin
    \f

    message procedure operatør side x+1 - 810617/hko;
    
              <* 2: inkluder *>
              integer k,n;
              integer array field msk,iaf1;
    
              i:=monitor(4) process address:(z_op(nr),0,ia);
              if i=0 then
              begin
                fejlreaktion(3<*programfejl*>,nr,
                    <:operatør(nr) eksisterer ikke:>,1);
                d.op_ref.resultat:=28;
              end
              else
              begin
                i:=monitor(8) reserve process:(z_op(nr),0,ia);
                d.op_ref.resultat:=if i<>0 then 16 <*skærm optaget*>
                                   else if d.op_ref.opkode = 0 then 0
                                   else  3;<*udført*>
                if i > 0 then
                  fejlreaktion(4<*monitor res*>,nr*100 +i,
                               <:operatørskærm reservation:>,1)
                else
                begin
                  i:=terminal_tab.ref.terminal_tilstand;
    <*940418/cl inkluderet sættes i stop - start *>
                  kode:= d.opref.opkode extract 12;
                  if kode <> 0 then
                    terminal_tab.ref.terminal_tilstand:=
                      (d.opref.opkode shift (-12) shift 21) + (i extract 21)
                  else
    <*940418/cl inkluderet sættes i stop - slut *>
                    terminal_tab.ref.terminal_tilstand:= i extract 
                      (if i shift(-21) extract 2 = 3 then 21 else 23);
                  for i:= 1 step 1 until max_antal_kanaler do
                  begin
                    iaf:= (i-1)*kanalbeskrlængde;
                    sætbit_ia(kanaltab.iaf.kanal_alarm,nr,0);
                  end;
                  skærm_måde:= 0;
                  sætbit_ia(operatørmaske,nr,
                    (if terminal_tab.ref.terminal_tilstand shift (-21) = 3
                     then 0 else 1));
                  for k:= nr, 65 step 1 until top_bpl_gruppe do
                  begin
                    msk:= k*op_maske_lgd;
                    if læsbit_ia(bpl_def.msk,nr) then 
    <**>            begin
                      n:= 0;
                      for i:= 1 step 1 until max_antal_operatører do
                      if læsbit_ia(bpl_def.msk,i) then
                      begin
                        iaf1:= i*terminal_beskr_længde;
                        if terminal_tab.iaf1.terminal_tilstand 
                                                     shift (-21) < 3 then
                          n:= n+1;
                      end;  
                      bpl_tilst(k,1):= n;
                    end;
    <**> <*  
                      bpl_tilst(k,1):= bpl_tilst(k,1) + 
                        (if læsbit_ia(operatørmaske,nr) then 1 else 0);
      *>          end;
                  tofrom(opkaldsflag,alle_operatører,op_maske_lgd);
                  sætbit_ia(opkaldsflag,nr,0);
                  signal_bin(bs_mobil_opkald);
    <*940418/cl inkluderet sættes i stop - start *>
                  if terminal_tab.ref.terminal_tilstand shift (-21) = 3 then
    <*V*>           ht_symbol(z_op(nr))
                  else
    <*940418/cl inkluderet sættes i stop - slut *>
    <*V*>           skriv_skærm(nr);
                  cursor(z_op(nr),24,1);
    <*V*>         setposition(z_op(nr),0,0);
                end;
              end;
              if d.op_ref.opkode = 0 then
                signal_ch(cs_operatør(nr),op_ref,d.op_ref.optype)
              else
              signal_ch(d.op_ref.retur,op_ref,d.op_ref.optype);
            end;
    
            begin
    \f

    message procedure operatør side x+2 - 820304/hko;
    
              <* 3: ekskluder *>
              integer k,n;
              integer array field iaf1,msk;
    
              write(z_op(nr),"esc" add 128,1,<:ÆH:>,"esc" add 128,1,<:ÆJ:>);
    <*V*>     setposition(z_op(nr),0,0);
              monitor(10) release process:(z_op(nr),0,ia);
              d.op_ref.resultat:=3;
              signal_ch(d.op_ref.retur,op_ref,d.op_ref.optype);
              terminal_tab.ref.terminal_tilstand:= 7 shift 21 +
                terminal_tab.ref.terminal_tilstand extract 21;
              if sæt_bit_ia(operatørmaske,nr,0)=1 then
              for k:= nr, 65 step 1 until top_bpl_gruppe do
              begin
                msk:= k*op_maske_lgd;
                if læsbit_ia(bpl_def.msk,nr) then 
    <**>        begin
                  n:= 0;
                  for i:= 1 step 1 until max_antal_operatører do
                  if læsbit_ia(bpl_def.msk,i) then
                  begin
                    iaf1:= i*terminal_beskr_længde;
                    if terminal_tab.iaf1.terminal_tilstand 
                                                 shift (-21) < 3 then
                      n:= n+1;
                  end;  
                  bpl_tilst(k,1):= n;
                end;
    <**> <*  
                  bpl_tilst(k,1):= bpl_tilst(k,1)-1;
      *>      end;
              signal_bin(bs_mobil_opkald);
              if opk_alarm.tab.alarm_tilst > 0 then
              begin
                opk_alarm.tab.alarm_kmdo:= 3;
                signal_bin(bs_opk_alarm);
              end;
            end;
            begin
    
              <* 4: opdater skærm *>
    
              signal_ch(cs_op_retur,op_ref,d.op_ref.optype);
              while (læsbit_ia(samtaleflag,nr) or læsbit_ia(opkaldsflag,nr) or
                læsbit_ia(kanalflag,nr) ) and læsbit_ia(operatørmaske,nr) and
                skærmmåde=0 do
             begin
    
    <*+2*>    if testbit13 and overvåget then
              disable begin
                write(out,"nl",1,<:opdater skærm(:>,<<d>,nr,
                  <:) opkaldsflag::>,"nl",1);
                outintbits_ia(out,opkaldsflag,1,op_maske_lgd//2);
                write(out,<: operatørmaske::>,"nl",1);
                outintbits_ia(out,operatørmaske,1,op_maske_lgd//2);
                write(out,<: skærmmåde=:>,skærmmåde,"nl",0);
                ud;
              end;
    <*-2*>
              if sætbit_ia(samtaleflag,nr,0)=1 and op_talevej(nr)<>0 then
              begin
                skriv_skærm_bvs(nr);
    <*940920    inspect(bs_talevej_udkoblet(op_talevej(nr)),status);
                if status>0 then
                begin
                  for ll:= 1 step 1 until terminalbeskrlængde//2 do
                    terminaltab.ref(ll):= 0;
                  skriv_skærm_bvs(nr);
                  wait(bs_talevej_udkoblet(op_talevej(nr)));
                end;
                for i:= 1 step 1 until max_antal_kanaler do
                begin
                  iaf:= (i-1)*kanalbeskrlængde;
                  inspect(ss_samtale_nedlagt(i),status);
                  if status>0 and
                    tv_operatør(kanaltab.iaf.kanal_tilstand shift (-16))=nr then
                  begin
                    kanaltab.iaf.kanal_tilstand:=
                      kanaltab.iaf.kanal_tilstand shift (-10) extract 6 shift 10;
                    for ll:= 2 step 1 until kanalbeskrlængde//2 do
                      kanaltab.iaf(ll):= 0;
                    skriv_skærm_kanal(nr,i);
                    repeat
                      wait(ss_samtale_nedlagt(i));
                      inspect(ss_samtale_nedlagt(i),status);
                    until status=0;
                  end;
                end;
    940920*>    cursor(z_op(nr),1,1);
                setposition(z_op(nr),0,0);
              end;
              if (læsbit_ia(opkaldsflag,nr) or læsbit_ia(kanalflag,nr))
                 and læsbit_ia(operatørmaske,nr) and skærmmåde = 0 then
              begin
    <*V*>       setposition(z_op(nr),0,0);
                if sætbit_ia(opkaldsflag,nr,0) =1 then
                  skriv_skærm_opkaldskø(nr);
                if sætbit_ia(kanalflag,nr,0) =1 then
                begin
                  for i:=1 step 1 until max_antal_kanaler do
                    skriv_skærm_kanal(nr,i);
                end;
                cursor(z_op(nr),1,1);
    <*V*>       setposition(z_op(nr),0,0);
              end;
             end;
            end;
            begin
    \f

    message procedure operatør side x+3 - 830310/hko;
    
              <* 5: samtale etableret *>
    
              res:= d.op_ref.resultat;
              b_v:= d.op_ref.data(3) extract 4;
              b_s:= d.op_ref.data(4);
              signal_ch(d.op_ref.retur,op_ref,d.op_ref.optype);
              if res = 3 and terminal_tab.ref(1) shift(-21) = 2 then
              begin
                sætbit_i(terminal_tab.ref(1),21,1);
                sætbit_i(terminal_tab.ref(1),22,0);
                sætbit_i(terminal_tab.ref(1),2,0);
                sæt_hex_ciffer(terminal_tab.ref,3,b_v);
                terminal_tab.ref(2):= b_s;
                sæt_bit_i(terminal_tab.ref(1),2<* opt. *>,0);
                iaf:= (b_s extract 4 - 1)*kanal_beskr_længde;
                kanaltab.iaf.kanal_tilstand:= kanaltab.iaf.kanal_tilstand
                  shift (-10) shift 10 + terminal_tab.ref(1) extract 10;
    
                if læsbit_ia(operatørmaske,nr) and skærmmåde = 0 then
                begin
    <*V*>         setposition(z_op(nr),0,0);
                  skriv_skærm_b_v_s(nr);
    <*V*>         setposition(z_op(nr),0,0);
                end;
              end
              else
              if terminal_tab.ref(1) shift(-21) = 2 then
              begin
                sætbit_i(terminal_tab.ref(1),22,0);
                sætbit_i(terminal_tab.ref(1),2,0);
                sæt_hex_ciffer(terminal_tab.ref,3,b_v);
                terminal_tab.ref(2):= 0;
                if læsbit_ia(operatørmaske,nr) and skærmmåde = 0 then
                begin
    <*V*>         setposition(z_op(nr),0,0);
                  cursor(z_op(nr),21,17);
                  write(z_op(nr),<:EJ FORB:>);
    <*V*>         setposition(z_op(nr),0,0);
                end;
              end
              else fejlreaktion(3<*prg.fejl*>,terminal_tab.ref(1) shift(-21),
                     <:terminal tilstand:>,1);
            end;
    
            begin
    \f

    message procedure operatør side x+4 - 810602/hko;
    
              <* 6: radiokanal ekskluderet *>
    
              læs_hex_ciffer(terminal_tab.ref,3,b_v);
              pos:= d.op_ref.data(1);
              signalch(d.op_ref.retur,op_ref,d.op_ref.optype);
              indeks:= terminal_tab.ref(2);
              b_s:= if indeks shift (-22) = 3 and indeks extract 22 = pos
                    then indeks extract 4 else 0;
              if b_v = pos then
                sæt_hex_ciffer(terminal_tab.ref,3,0);
              if b_s = pos then
              begin
                terminal_tab.ref(2):= 0;
                sætbit_i(terminal_tab.ref(1),21,0);
                sætbit_i(terminal_tab.ref(1),22,0);
                sætbit_i(terminal_tab.ref(1),2,0);
              end;
              if skærmmåde=0 then
              begin
                if b_v = pos or b_s = pos then
    <*V*>         skriv_skærm_b_v_s(nr);
    <*V*>       skriv_skærm_kanal(nr,pos);
                cursor(z_op(nr),1,1);
                setposition(z_op(nr),0,0);
              end;
            end;
    
            begin
    \f

    message procedure operatør side x+5 - 950118/cl;
    
              <* 7: operatørmeddelelse *>
              integer afs, kl, i;
              real dato, t;
    
              cursor(z_op(nr),24,1);
              write(z_op(nr),"esc" add 128,1,<:ÆK:>);
              cursor(z_op(nr),23,1);
              write(z_op(nr),"esc" add 128,1,<:ÆK:>);
    
              afs:= d.opref.data.op_spool_kilde;
              dato:= systime(4,d.opref.data.op_spool_tid,t);
              kl:= round t;
              write(z_op(nr),<:! fra op:>,<<d>,afs,"sp",1,
                if afs=0 then <:SYSOP:> else string bpl_navn(afs));
              i:= replacechar(1,'.');
              disable write(z_op(nr),"sp",1,<<zd_dd_dd>,kl,"nl",1);
              replacechar(1,i);
              write(z_op(nr),d.opref.data.op_spool_text);
    
              if terminal_tab.ref.terminal_tilstand shift (-21) <> 3 then
              begin
                if opk_alarm.tab.alarm_lgd > 0 and
                   opk_alarm.tab.alarm_tilst < 1 and
                   opk_alarm.tab.alarm_kmdo < 1
                then
                begin
                  opk_alarm.tab.alarm_kmdo := 1;
                  signalbin(bs_opk_alarm);
                end
                else
                if opk_alarm.tab.alarm_lgd = 0 then
                  write(z_op(nr),"bel",1,"del",8,"bel",1,"del",8,"bel",1);
              end;
    
              setposition(z_op(nr),0,0);
              
              signalch(d.opref.retur,opref,d.opref.optype);
            end;
    
            begin
    
    <*+4*>    fejl_reaktion(3<*programfejl *>,aktion,<:case aktion:>,2);
    <*-4*>
            end
          end; <* case aktion+6 *>
    
         until false;
      op_trap:
        skriv_operatør(zbillede,1);
      end operatør;
     
    \f

    message procedure op_cqftest side 1;
    
    procedure op_cqftest;
    begin                     
      integer array field opref, ref, ref1;
      integer i, j, tv, cqf, res, interval, pausetid;
      real nu, næstetid, kommstart, kommslut;
      
      procedure skriv_op_cqftest(zud,omfang);
        value                        omfang;
        zone                     zud;
        integer                      omfang;
      begin
        write(zud,"nl",1,<:+++ op-cqftest:>);
        if omfang > 0 then
        disable begin     
          real t;
    
          trap(slut);
          write(zud,"nl",1,
            <:  opref:       :>,opref,"nl",1,
            <:  ref:         :>,ref,"nl",1,
            <:  i:           :>,i,"nl",1,
            <:  tv:          :>,tv,"nl",1,
            <:  cqf:         :>,cqf,"nl",1,
            <:  res:         :>,res,"nl",1,
            <:  interval     :>,interval,"nl",1,
            <:  pausetid:    :>,pausetid,"nl",1,
            <:  nu:          :>,<<zddddd.dddddd>,systime(4,nu,t)+t/1000000,"nl",1,
            <:  næste-tid:   :>,systime(4,næstetid,t)+t/1000000,"nl",1,
            <::>);
          skriv_coru(zud,coru_no(292));
    slut:
        end;
      end skriv_op_cqftest;
        
      trap(op_cqf_trap);
      interval:= 6*60*60; <* 6 timer mellem test *>
      stackclaim(1000);
    
      
    <*+4*>if (testbit8 and overvåget) or testbit28 then
            skriv_op_cqftest(out,0);
    <*-4*>
    
    <*V*> waitch(cs_cqf,opref,op_optype,-1);
      repeat
        i:= sidste_tv_brugt; tv:= 0;
        repeat
          i:= (i mod max_antal_taleveje) + 1;
          if tv_operatør(i) = 0 then tv:= i;
        until (tv<>0) or (i=sidste_tv_brugt);
    
        if tv<>0 then
        begin
          tv_operatør(tv):= -1;
          systime(1,0.0,nu); næste_tid:= nu + interval;
          for cqf:= 1 step 1 until max_cqf do
          begin
            ref:= (cqf-1)*cqf_lgd;
            if cqf_tabel.ref.cqf_bus > 0 and cqf_tabel.ref.cqf_næste_tid < nu then
            begin
              startoperation(opref,292,cs_cqf,1 shift 12 + 41);
              d.opref.data(1):= tv;
              d.opref.data(2):= cqf_tabel.ref.cqf_bus;
                      disable if testbit19 then
                      begin
                        integer i; <*lav en trap-bar blok*>
    
                        trap(test19_trap);
                        systime(1,0,kommstart);
                        write(zrl,<<zd dd dd.dd >,now,<:CQF-test start OP :>);
                        skriv_id(zrl,d.opref.data(2),0);
    test19_trap:        outchar(zrl,'nl');   
                      end;
              signalch(cs_rad,opref,op_optype or gen_optype);
    <*V*>     waitch(cs_cqf,opref,op_optype,-1);
              res:= d.opref.resultat;
    <*+2*>
                      disable if testbit19 then
                      begin
                        integer i; <*lav en trap-bar blok*>
    
                        trap(test19_trap);
                        systime(1,0,kommslut);
                        write(zrl,<<zd dd dd.dd >,now,<:CQF-test  slut OP :>);
                        if d.opref.data(7)=2 then outchar(zrl,'*');
                        if d.opref.data(9)<>0 then 
                        begin
                          skriv_id(zrl,d.opref.data(9),0);
                          outchar(zrl,' ');
                        end;
                        if d.opref.data(8)<>0 then
                        begin
                          skriv_id(zrl,d.opref.data(8),0);
                          outchar(zrl,' ');
                        end;
                        if d.opref.data(12)<>0 then
                        begin
                          if d.opref.data(12) shift (-20) = 15 then
                            write(zrl,<:OMR*:>)
                          else
                          if d.opref.data(12) shift (-20) = 14 then
                            write(zrl,
                              string områdenavn(d.opref.data(12) extract 20))
                          else
                            skriv_id(zrl,d.opref.data(12),0);
                          outchar(zrl,' ');
                        end;
                        if d.opref.data(10)<>0 then
                        begin
                          skriv_id(zrl,d.opref.data(10),0);
                          outchar(zrl,' ');
                        end;
                        write(zrl,<:res=:>,<<d>,res,<: btid=:>,
                          <<dd.dd>,kommslut-kommstart);
    test19_trap:        outchar(zrl,'nl');   
                      end;
    <*-2*>
              if res=3 and cqf_tabel.ref.cqf_bus > 0 then
              begin
                delay(3);
                d.opref.opkode:= 12 shift 12 + 41;
                d.opref.resultat:= 0;
                      disable if testbit19 then
                      begin
                        integer i; <*lav en trap-bar blok*>
    
                        trap(test19_trap);
                        systime(1,0,kommstart);
                        write(zrl,<<zd dd dd.dd >,now,<:CQF-test start NE :>);
    test19_trap:        outchar(zrl,'nl');   
                      end;
                signalch(cs_rad,opref,op_optype or gen_optype);
    <*V*>       waitch(cs_cqf,opref,op_optype,-1);
    <*+2*>
                      disable if testbit19 then
                      begin
                        integer i; <*lav en trap-bar blok*>
    
                        trap(test19_trap);
                        systime(1,0,kommslut);
                        write(zrl,<<zd dd dd.dd >,now,<:CQF-test  slut NE :>);
                        write(zrl,<:res=:>,<<d>,d.opref.resultat,<: btid=:>,
                          <<dd.dd>,kommslut-kommstart);
    test19_trap:        outchar(zrl,'nl');   
                      end;
    <*-2*>
                if d.opref.resultat <> 3 then
                  fejlreaktion(19,d.opref.resultat,<:CQF-test nedlæg resultat:>,1);
                if cqf_tabel.ref.cqf_bus > 0 and cqf_tabel.ref.cqf_fejl > 0 then
                begin
                  startoperation(opref,292,cs_cqf,23);
                  i:= 1;
                  hægtstring(d.opref.data,i,<:CQF-test bus :>);
                  anbringtal(d.opref.data,i,cqf_tabel.ref.cqf_bus,4);
                  skriv_tegn(d.opref.data,i,' ');
                  hægtstring(d.opref.data,i,string cqf_tabel.ref.cqf_id);
                  hægtstring(d.opref.data,i,<: ok!:>);
                  repeat afsluttext(d.opref.data,i) until (i mod 6) = 1;
                  signalch(cs_io,opref,gen_optype);
    <*V*>         waitch(cs_cqf,opref,gen_optype,-1);
                end;
                if cqf_tabel.ref.cqf_bus > 0 then
                begin
                  cqf_tabel.ref.cqf_fejl:= 0;
                  systime(1,0.0,cqf_tabel.ref.cqf_ok_tid);
                  cqf_tabel.ref.cqf_næste_tid:= nu+interval;
                end;
              end <*res=3*>
              else
              if (res=20<*ej forb.*> or res=59<*radiofejl*>) and
                 cqf_tabel.ref.cqf_bus > 0
              then
              begin
                cqf_tabel.ref.cqf_næste_tid:= nu + interval;
                cqf_tabel.ref.cqf_fejl:= cqf_tabel.ref.cqf_fejl + 1;
                if cqf_tabel.ref.cqf_fejl >= 2 then
                begin
                  startoperation(opref,292,cs_cqf,23);
                  i:= 1;
                  hægtstring(d.opref.data,i,<:CQF-test bus :>);
                  anbringtal(d.opref.data,i,cqf_tabel.ref.cqf_bus,4);
                  skriv_tegn(d.opref.data,i,' ');
                  hægtstring(d.opref.data,i,string cqf_tabel.ref.cqf_id);
                  hægtstring(d.opref.data,i,<: ingen forbindelse!:>);
                  repeat afsluttext(d.opref.data,i) until (i mod 6) = 1;
                  signalch(cs_io,opref,gen_optype);
    <*V*>         waitch(cs_cqf,opref,gen_optype,-1);
                end;
              end;
              delay(10);
            end;
            if cqf_tabel.ref.cqf_bus > 0 and 
               cqf_tabel.ref.cqf_næste_tid < næste_tid
            then næste_tid:= cqf_tabel.ref.cqf_næste_tid;
          end; <*for cqf*>
    
          tv_operatør(tv):= 0; tv:= 0;
          if op_cqf_tab_ændret then
          begin
            j:= skrivfil(1033,1,i);
            if j<>0 then
              fejlreaktion(6,j,<:CQF-test cqf-tabel:>,1);
            sorter_cqftab(1,max_cqf);
            for cqf:= 1 step 1 until max_cqf do
            begin
              ref:= (cqf-1)*cqf_lgd;
              ref1:= (cqf-1)*cqf_id;
              tofrom(fil(i).ref1,cqf_tabel.ref,cqf_id);
            end;
            op_cqf_tab_ændret:= false;
          end;
        end; <*tv*>
    
        systime(1,0.0,nu);
        pausetid:= round(næste_tid - nu);
        if pausetid < 30 then pausetid:= 30;
    
    <*V*> delay(pausetid);
                 
      until false;
    
    op_cqf_trap:
      disable skriv_op_cqftest(zbillede,1);
    end op_cqftest;
    \f

    message procedure op_spool side 1;
    
    procedure op_spool;
    begin                     
      integer array field opref, ref;
      integer næste_tomme, i;
      
      procedure skriv_op_spool(zud,omfang);
        value                      omfang;
        zone                   zud;
        integer                    omfang;
      begin
        write(zud,"nl",1,<:+++ op-spool:>);
        if omfang > 0 then
        disable begin     
          real t;
    
          trap(slut);
          write(zud,"nl",1,
            <:  opref:       :>,opref,"nl",1,
            <:  næste-tomme: :>,næste_tomme,"nl",1,
            <:  ref:         :>,ref,"nl",1,
            <:  i:           :>,i,"nl",1,
            <::>);
          skriv_coru(zud,coru_no(293));
    slut:
        end;
      end skriv_op_spool;
        
      trap(op_spool_trap);
      stackclaim(400);
    
      næste_tomme:= 0;
      
    <*+4*>if (testbit8 and overvåget) or testbit28 then
            skriv_op_spool(out,0);
    <*-4*>
    
      repeat
    <*V*> waitch(cs_op_spool,opref,true,-1);
        inspect(ss_op_spool_tomme,i);
    
        if d.opref.opkode extract 12 <> 37 then
        begin
          d.opref.resultat:= 31;
          fejlreaktion(2<*opkode*>,d.opref.opkode extract 12,<:op_spool:>,1);
        end
        else
        if i<=0 then
          d.opref.resultat:= 32 <*ingen fri plads*>
        else
        begin
    <*V*> wait(ss_op_spool_tomme);
          ref:= næste_tomme*op_spool_postlgd;
          næste_tomme:= (næste_tomme+1) mod op_spool_postantal;
          i:= d.opref.opsize - data;
          if i > (op_spool_postlgd - op_spool_text) then 
            i:= (op_spool_postlgd - op_spool_text);
          op_spool_buf.ref.op_spool_kilde:=
            (if d.opref.kilde//100 = 2 then d.opref.kilde mod 100 else 0);
          op_spool_buf.ref.op_spool_tid:= d.opref.tid;
          tofrom(op_spool_buf.ref.op_spool_text,d.opref.data,i);
          op_spool_buf.ref(op_spool_postlgd//2):=
             op_spool_buf.ref(op_spool_postlgd//2) shift (-8) shift 8;
          d.opref.resultat:= 3;
    
          signal(ss_op_spool_fulde);
        end;
    
        signalch(d.opref.retur,opref,d.opref.optype);
      until false;
    
    op_spool_trap:
      disable skriv_op_spool(zbillede,1);
    end op_spool;
    \f

    message procedure op_medd side 1;
    
    procedure op_medd;
    begin
      integer array field opref, ref;
      integer næste_fulde, i;
    
      procedure skriv_op_medd(zud,omfang);
        value                     omfang;
        zone                  zud;
        integer                   omfang;
      begin
        write(zud,"nl",1,<:+++ op-medd:>);
        if omfang > 0 then
        disable begin     
          real t;
    
          trap(slut);
          write(zud,"nl",1,
            <:  opref:       :>,opref,"nl",1,
            <:  næste-fulde: :>,næste_fulde,"nl",1,
            <:  ref:         :>,ref,"nl",1,
            <:  i:           :>,i,"nl",1,
            <::>);
          skriv_coru(zud,coru_no(294));
    slut:
        end;
      end skriv_op_medd;
        
      trap(op_medd_trap);
      næste_fulde:= 0;
      stackclaim(400);
      
    <*+4*>if (testbit8 and overvåget) or testbit28 then
            skriv_op_medd(out,0);
    <*-4*>
    
      repeat
    <*V*> wait(ss_op_spool_fulde);
    <*V*> waitch(cs_op_medd,opref,true,-1);
    
        ref:= næste_fulde*op_spool_postlgd;
        næste_fulde:= (næste_fulde+1) mod op_spool_postantal;
    
        startoperation(opref,curr_coruid,cs_op_medd,38);
        d.opref.resultat:= 0;
        tofrom(d.opref.data,op_spool_buf.ref,op_spool_postlgd);
        signalch((if op_spool_buf.ref.op_spool_kilde = 0 then cs_op else cs_io),
          opref,gen_optype);
        signal(ss_op_spool_tomme);
      until false;
    
    op_medd_trap:
      disable skriv_op_medd(zbillede,1);
    end op_medd;
    \f

    message procedure alarmur side 1;
    
    procedure alarmur;
    begin
      integer ventetid, nr;
      integer array field opref, tab;
      real nu;
      
      procedure skriv_alarmur(zud,omfang);
        value                     omfang;
        zone                  zud;
        integer                   omfang;
      begin
        write(zud,"nl",1,<:+++ alarmur:>);
        if omfang > 0 then
        disable begin     
          real t;
    
          trap(slut);
          write(zud,"nl",1,
            <:  ventetid:  :>,ventetid,"nl",1,
            <:  nr:        :>,nr,"nl",1,
            <:  opref:     :>,opref,"nl",1,
            <:  tab:       :>,tab,"nl",1,
            <:  nu:       :>,<< zddddd>,systime(4,nu,t),t,"nl",1,
            <::>);
          skriv_coru(zud,coru_no(295));
    slut:
        end;
      end skriv_alarmur;
        
      trap(alarmur_trap);
      stackclaim(400);
    
      systime(1,0.0,nu);
      ventetid:= -1;
      repeat
        waitch(cs_opk_alarm_ur,opref,op_optype,ventetid);
        if opref > 0 then
          signalch(d.opref.retur,opref,op_optype);
    
        ventetid:= -1;
        systime(1,0.0,nu);
        for nr:= 1 step 1 until max_antal_operatører do
        begin
          tab:= (nr-1)*opk_alarm_tab_lgd;
          if opk_alarm.tab.alarm_tilst > 0 and
             opk_alarm.tab.alarm_lgd >= 0 then
          begin
            if (nu - opk_alarm.tab.alarm_start) >= opk_alarm.tab.alarm_lgd then
            begin
              opk_alarm.tab.alarm_kmdo:= 3;
              signalbin(bs_opk_alarm);
              if ventetid > 2 or ventetid=(-1) then ventetid:= 2;
            end
            else
            if (nu - opk_alarm.tab.alarm_start) < ventetid or ventetid = (-1) then
              ventetid:= (nu - opk_alarm.tab.alarm_start);
          end;
        end;
        if ventetid=0 then ventetid:= 1;
      until false;
    
    alarmur_trap:
      disable skriv_alarmur(zbillede,1);
    end alarmur;
    \f

    message procedure opkaldsalarmer side 1;
    
    procedure opkaldsalarmer;
    begin
      integer nr, ny_kommando, tilst, aktion, tt;
      integer array field tab, opref, alarmop;
    
      procedure skriv_opkaldsalarmer(zud,omfang);
        value                            omfang;
        zone                         zud;
        integer                          omfang;
      begin
        write(zud,"nl",1,<:+++ opkaldsalarmer:>);
        if omfang>0 then
        disable begin
          real array field raf;
          trap(slut);
          raf:=0;
          write(zud,"nl",1,
              <:  nr:          :>,nr,"nl",1,
              <:  ny-kommando: :>,ny_kommando,"nl",1,
              <:  tilst:       :>,tilst,"nl",1,
              <:  aktion:      :>,aktion,"nl",1,
              <:  tt:          :>,false add tt,1,"nl",1,
              <:  tab:         :>,tab,"nl",1,
              <:  opref:       :>,opref,"nl",1,
              <:  alarmop:     :>,alarmop,"nl",1,
              <::>);
          skriv_coru(zud,coru_no(296));
    slut:
        end;
      end skriv_opkaldsalarmer;
    
      trap(opk_alarm_trap);
      stackclaim(400);
    
    <*+2*>if (testbit8 and overvåget) or testbit28 then
            skriv_opkaldsalarmer(out,0);
    <*-2*>
    
      repeat
        wait(bs_opk_alarm);
        alarmop:= 0;
        for nr:= 1 step 1 until max_antal_operatører do
        begin
          tab:= (nr-1)*opk_alarm_tab_lgd;
          ny_kommando:= opk_alarm.tab.alarm_kmdo;
          tilst:= opk_alarm.tab.alarm_tilst;
          aktion:= case ny_kommando+1 of (
            <*ingenting*> case tilst+1 of (4,4,4),
            <*normal   *> case tilst+1 of (1,4,4),
            <*nød      *> case tilst+1 of (2,2,4),
            <*sluk     *> case tilst+1 of (4,3,3));
          tt:= case aktion of ('B','C','F','-');
          if tt<>'-' then
          begin
    <*V*>   waitch(cs_tvswitch_adgang,opref,op_optype,-1);
            startoperation(opref,296,cs_opk_alarm,tt shift 12 + 44);
            d.opref.data(1):= nr+16;
            signalch(cs_talevejsswitch,opref,op_optype);
    <*V*>   waitch(cs_opk_alarm,opref,op_optype,-1);
            if d.opref.resultat = 3 then
            begin
              opk_alarm.tab.alarm_kmdo:= 0;
              opk_alarm.tab.alarm_gtilst:= opk_alarm.tab.alarm_tilst;
              opk_alarm.tab.alarm_tilst:= case aktion of (1,2,0);
              if aktion < 3 then
              begin
                systime(1,0.0,opk_alarm.tab.alarm_start);
                if alarmop = 0 then 
                  waitch(cs_opk_alarm_ur_ret,alarmop,op_optype,-1);
              end;
            end;
            signalch(cs_tvswitch_adgang,opref,op_optype or gen_optype);
          end;
        end;
        if alarmop<>0 then
        begin
          startoperation(alarmop,296,cs_opk_alarm_ur_ret,0);
          signalch(cs_opk_alarm_ur,alarmop,op_optype);
        end;
      until false;
    
    opk_alarm_trap:
      disable skriv_opkaldsalarmer(zbillede,1);
    end;  
    
    \f

    message procedure tvswitch_input side 1 - 940810/cl;
    
      procedure tv_switch_input;
      begin
        integer array field opref;
        integer tt,ant;
        boolean ok;
        integer array ia(1:128);
    
        procedure skriv_tvswitch_input(zud,omfang);
          value                            omfang;
          zone                         zud;
          integer                          omfang;
        begin
          write(zud,"nl",1,<:+++ tvswitch-input:>);
          if omfang>0 then
          disable begin
            real array field raf;
            trap(slut);
            raf:=0;
            write(zud,"nl",1,
              <:  opref:  :>,opref,"nl",1,
              <:  ok:     :>,(if ok then <:TRUE:> else <:FALSE:>),"nl",1,
              <:  ant:    :>,ant,"nl",1,
              <:  tt:     :>,tt,"nl",1,
              <::>);
            write(zud,"nl",1,<:ia: :>);
            skrivhele(zud,ia.raf,256,2);
            skriv_coru(zud,coru_no(297));
    slut:
          end;
        end skriv_tvswitch_input;
    \f

        boolean procedure læs_tlgr;
        begin
          integer kl,ch,i,pos,p;
          long field lf;
          boolean ok;
    
          integer procedure readch(z,c);
            zone z; integer c;
          begin
            readch:= readchar(z,c);
    <*+2*>  if testbit15 and overvåget then
            disable begin
              if ' ' <= c and c <= 'ü' then outchar(zrl,c)
              else write(zrl,"<",1,<<d>,c,">",1);
              if c='em' then write(zrl,<: *timeout*:>);
            end;
    <*-2*>
          end;
    
          ok:= false; tt:=' ';
          repeat
            readchar(z_tv_in,ch);
          until ch<>'em';
          repeatchar(z_tv_in);
    
    <*+2*>if testbit15 and overvåget then
          disable write(zrl,<<zd dd dd.dd >,now,<:switch-ind:  :>);
    <*-2*>
    
          for kl:=readch(z_tv_in,ch) while ch<>'%' and ch<>'nl' and ch<>'em' do ;
          if ch='%' then
          begin
            ant:= 0; pos:= 1; lf:= 4;
            ok:= true;
            for i:= 1 step 1 until 128 do ia(i):= 0;
    
            for kl:=readch(z_tv_in,ch) while kl = 6 do
              skrivtegn(ia,pos,ch);
    
            p:=pos;
            repeat afsluttext(ia,p) until p mod 6 = 1;
    
            if ia.lf=long<:ACK:> and ch='nl' then tt:= '+' else
            if ia.lf=long<:NACK:> and ch='nl' then tt:= '-' else
            if pos=2 and ch=' ' then tt:= ia(1) shift (-16) else ok:= false;
    
            if ok and ch=' ' then
              for kl:=readch(z_tv_in,ch) while ch=' ' do ;
    
            while kl = 2 do
            begin
              i:= ch - '0';
              for kl:=readch(z_tv_in,ch) while kl = 2 do i:= i*10 + ch-'0';
              if ant < 128 then
              begin
                ant:= ant+1;
                ia(ant):= i;
              end
              else
                ok:= false;
              while ch=' ' do kl:=readch(z_tv_in,ch);
            end;
            if ch<>'nl' then ok:= false;
            while ch<>'nl' and ch<>'em' do kl:=readch(z_tv_in,ch);
    <* !!   setposition(z_tv_in,0,0); !! *>
    <*+2*>  if testbit15 and overvåget then disable outchar(zrl,'nl');
    <*-2*>
    
            if tt='+' or tt='-' or tt='Q' or tt='E' then
              ok:= ok
            else if tt='C' or tt='N' or
                    tt='P' or tt='U' or tt='S' or tt='Z' then
              ok:= ok and ant=1
            else if tt='X' or tt='Y' then
              ok:= ok and ant=2
            else if tt='T' or tt='W' then
              ok:= ok and ant=64
            else if tt='R' then
              ok:= ok and ant extract 1 = 0
            else
            begin
              ok:= false;
              fejlreaktion(21,tt,<:Ukendt telegramtype:>,2 shift 12 + 1);
            end;
    
          end; <* if ch='%' *>
          læs_tlgr:= ok;
        end læs_tlgr;
    \f

        trap(tvswitch_input_trap);
        stackclaim(400);
        for ant:= 1 step 1 until 128 do ia(ant):= 0;
    
    <*+2*>if (testbit8 and overvåget) or testbit28 then
            skriv_tvswitch_input(out,0);
    <*-2*>
    
        repeat
          ok:= læs_tlgr;
          if ok then
          begin
    <*V*>   waitch(cs_tvswitch_input,opref,op_optype,-1);
            start_operation(opref,297,cs_tvswitch_input,0);
            d.opref.resultat:= tt shift 12 + ant;
            tofrom(d.opref.data,ia,ant*2);
            signalch(cs_talevejsswitch,opref,op_optype);
          end;
        until false;
    
    tvswitch_input_trap:
    
        disable skriv_tvswitch_input(zbillede,1);
    
      end tvswitch_input;
    \f

    message procedure tv_switch_adm side 1 - 940502/cl;
    
      procedure tv_switch_adm;
      begin
        integer array field opref;
        integer rc;
    
        procedure skriv_tv_switch_adm(zud,omfang);
          value                           omfang;
          zone                        zud;
          integer                         omfang;
        begin
          write(zud,"nl",1,<:+++ tv-switch-adm:>);
          if omfang>0 then
          disable begin
            trap(slut);
            write(zud,"nl",1,
              <:  opref:  :>,opref,"nl",1,
              <:  rc:     :>,rc,"nl",1,
              <::>);
            skriv_coru(zud,coru_no(298));
    slut:
          end;
        end skriv_tv_switch_adm;
    
        trap(tv_switch_adm_trap);
        stackclaim(400);
    
    <*+2*> if (testbit8 and overvåget) or testbit28 then
             disable skriv_tv_switch_adm(out,0);
    <*-2*>
    
    
    
    <* !!!!!!! PASSIVER KORUTINEN - cs_tvswitch_adm SIGNALERES ALDRIG !!!!!!! 
        waitch(cs_tvswitch_adm,opref,op_optype,-1);
    *>
    
        repeat
          waitch(cs_tvswitch_adgang,opref,op_optype,-1);
          start_operation(opref,298,cs_tvswitch_adm,'R' shift 12 + 44);
          rc:= 0;
          repeat
            signalch(cs_talevejsswitch,opref,op_optype);
    <*V*>   waitch(cs_tvswitch_adm,opref,op_optype,-1);
            rc:= rc+1;
          until rc=3 or d.opref.resultat=3;
    
          signalch(cs_tvswitch_adgang,opref,op_optype);
    
    <*V*> delay(15*60);
        until false;
    tv_switch_adm_trap:
        disable skriv_tv_switch_adm(zbillede,1);
      end;
    \f

    message procedure talevejsswitch side 1 -940426/cl;
    
      procedure talevejsswitch;
      begin
        integer tt, ant, ventetid;
        integer array field opref, gemt_op, tab;
        boolean ok;
        integer array ia(1:128);
    
        procedure skriv_talevejsswitch(zud,omfang);
          value                            omfang;
          zone                         zud;
          integer                          omfang;
        begin
          write(zud,"nl",1,<:+++ talevejsswitch:>);
          if omfang>0 then
          disable begin
            real array field raf;
            trap(slut);
            raf:= 0;
            write(zud,"nl",1,
              <:  tt:      :>,tt,"nl",1,
              <:  ant:     :>,ant,"nl",1,
              <:  ventetid: :>,ventetid,"nl",1,
              <:  opref:    :>,opref,"nl",1,
              <:  gemt-op:  :>,gemt_op,"nl",1,
              <:  tab:      :>,tab,"nl",1,
              <:  ok:       :>,(if ok then <:TRUE:> else <:FALSE:>),"nl",1,
              <::>);
            write(zud,"nl",1,<:ia: :>);
            skriv_hele(zud,ia.raf,256,2);
            skriv_coru(zud,coru_no(299));
    slut:
          end;
        end skriv_talevejsswitch;
    \f

        trap(tvswitch_trap);
        stackclaim(400);
        for ant:= 1 step 1 until 128 do ia(ant):= 0;
    
    <*+2*>if (testbit8 and overvåget) or testbit28 then
            skriv_talevejsswitch(out,0);
    <*-2*>
    
        ventetid:= -1; ant:= 0; tt:= ' ';
        repeat
          waitch(cs_talevejsswitch,opref,gen_optype or op_optype,ventetid);
          if opref > 0 then
          begin
            if d.opref.opkode extract 12 = 0 then
            begin <*input fra talevejsswitchen *>
              for ant:= 1 step 1 until 128 do ia(ant):= 0;
              tt:= d.opref.resultat shift (-12) extract 12;
              ant:= d.opref.resultat extract 12;
              tofrom(ia,d.opref.data,ant*2);
              signalch(d.opref.retur,opref,d.opref.optype);
    
              if tt<>'+' and tt<>'-' then
              begin
                write(z_tv_out,"%",1,<:ACK:>,"cr",1);
                setposition(z_tv_out,0,0);
    <*+2*>      if testbit15 and overvåget then
                disable begin
                  write(zrl,<<zd dd dd.dd >,now,<:switch-ud:  :>,<:%ACK:>);
                  outchar(zrl,'nl');
                end;
    <*-2*>
              end;
              if (tt='+' or tt='-') and gemt_op<>0 then
              begin
                d.gemt_op.resultat:= (if tt='+' then 3 else 0);
                signalch(d.gemt_op.retur,gemt_op,d.gemt_op.optype);
                gemt_op:= 0;
                ventetid:= -1;
              end
              else
              if tt='R' then
              begin
                for i:= 1 step 2 until ant do
                begin
                  if ia(i) <= max_antal_taleveje and
                     17 <= ia(i+1) and ia(i+1) <= max_antal_operatører+16
                  then
                  begin
                    if op_talevej(ia(i+1)-16)<>ia(i) then
                      tv_operatør(op_talevej(ia(i+1)-16)):= 0;
                    if tv_operatør(ia(i))<>ia(i+1)-16 then
                      op_talevej(tv_operatør(ia(i))):= 0;
                    tv_operatør(ia(i)):= ia(i+1)-16;
                    op_talevej(ia(i+1)-16):= ia(i);
                    sætbit_ia(samtaleflag,ia(i+1)-16,1);
                  end
                  else
                  if ia(i+1) <= max_antal_taleveje and
                     17 <= ia(i) and ia(i) <= max_antal_operatører+16
                  then
                  begin
                    if op_talevej(ia(i))<>ia(i+1)-16 then
                      tv_operatør(op_talevej(ia(i))):= 0;
                    if tv_operatør(ia(i+1)-16)<>ia(i) then
                      op_talevej(tv_operatør(ia(i+1)-16)):= 0;
                    tv_operatør(ia(i+1)):= ia(i)-16;
                    op_talevej(ia(i)-16):= ia(i+1);
                    sætbit_ia(samtaleflag,ia(i)-16,1);
                  end;
                end;
                signal_bin(bs_mobil_opkald);
    <*+2*> if testbit15 and testbit16 and overvåget then
           disable begin
             skriv_talevejs_tab(zrl); outchar(zrl,'nl');
           end;
    <*-2*>
              end <* tt='R' and ant>0 *> 
              else
              if tt='Y' then
              begin
                if ia(1) <= max_antal_taleveje and
                   17 <= ia(2) and ia(2) <= max_antal_operatører+16
                then
                begin
                  if tv_operatør(ia(1))=ia(2)-16 and
                     op_talevej(ia(2)-16)=ia(1)
                  then tv_operatør(ia(1)):= op_talevej(ia(2)-16):= 0;
                end
                else
                if ia(2) <= max_antal_taleveje and
                   17 <= ia(1) and ia(1) <= max_antal_operatører+16
                then
                begin
                  if tv_operatør(ia(2))=ia(1)-16 and
                     op_talevej(ia(1)-16)=ia(2)
                  then tv_operatør(ia(2)):= op_talevej(ia(1)-16):= 0;
                end;
              end
              else
              if tt='C' or tt='N' or tt='P' or tt='U' then
              begin
                waitch(cs_op_iomedd,opref,gen_optype,-1);
                startoperation(opref,299,cs_op_iomedd,23);
                ant:= 1;
                hægtstring(d.opref.data,ant,<:switch - port :>);
                anbringtal(d.opref.data,ant,ia(1),2);
                if 17<=ia(1) and ia(1)<=16+max_antal_operatører then
                begin
                  hægtstring(d.opref.data,ant,<: (:>);
                  if bpl_navn(ia(1)-16)=long<::> then
                  begin
                    hægtstring(d.opref.data,ant,<:op:>);
                    anbringtal(d.opref.data,ant,ia(1)-16,
                      if ia(1)-16 > 9 then 2 else 1);
                  end
                  else hægtstring(d.opref.data,ant,string bpl_navn(ia(1)-16));
                  skrivtegn(d.opref.data,ant,')');
                end;
                hægtstring(d.opref.data,ant,
                  if tt='C' then <: Kontakt med kontrolbox etableret:> else
                  if tt='N' then <: Kontakt med kontrolbox tabt:> else
                  if tt='P' then <: Tilgængelig:> else
                  if tt='U' then <: Ikke tilgængelig:> else <::>);
                repeat afsluttext(d.opref.data,ant) until ant mod 6 = 1;
                signalch(cs_io,opref,gen_optype);
              end
              else
              if tt='Z' then
              begin
                tab:= (ia(1)-16-1)*opk_alarm_tab_lgd;
                opk_alarm.tab.alarm_tilst:= opk_alarm.tab.alarm_gtilst;
              end
              else
              begin
                <* ikke implementeret *>
              end;
            end
            else
            if d.opref.opkode extract 12 = 44 then
            begin
              tt:= d.opref.opkode shift (-12);
              ok:= true;
              if tt='E' or tt='Q' or tt='R' or tt='W' or tt='S' or tt='I' then
              begin
    <*+2*> if testbit15 and overvåget then
           disable begin
             write(zrl,<<zd dd dd.dd >,now,<:switch-ud:  %:>,false add tt,1);
             outchar(zrl,'nl');
           end;
    <*-2*>
                write(z_tv_out,"%",1,false add tt,1,"cr",1);
                setposition(z_tv_out,0,0);
              end
              else
              if tt='B' or tt='C' or tt='F' then
              begin
    <*+2*> if testbit15 and overvåget then
           disable begin
             write(zrl,<<zd dd dd.dd >,now,<:switch-ud:  %:>,false add tt,1,
               " ",1,<<d>,d.opref.data(1));
             outchar(zrl,'nl');
           end;
    <*-2*>
                write(z_tv_out,"%",1,false add tt,1," ",1,<<d>,
                  d.opref.data(1),"cr",1);
                setposition(z_tv_out,0,0);
              end
              else
              if tt='A' or tt='D' or tt='T' then
              begin
    <*+2*> if testbit15 and overvåget then
           disable begin
             write(zrl,<<zd dd dd.dd >,now,<:switch-ud:  %:>,false add tt,1,
               " ",1,<<d>,d.opref.data(1)," ",1,d.opref.data(2));
             outchar(zrl,'nl');
           end;
    <*-2*>
                write(z_tv_out,"%",1,false add tt,1," ",1,<<d>,
                  d.opref.data(1)," ",1,d.opref.data(2),"cr",1);
                setposition(z_tv_out,0,0);
              end
              else
                ok:= false;
              if ok then
              begin
                gemt_op:= opref;
                ventetid:= 2;
              end
              else
              begin
                d.opref.resultat:= 4;
                signalch(d.opref.retur,opref,d.opref.optype);
              end;
            end;
          end
          else
          if gemt_op<>0 then
          begin <*timeout*>
            d.gemt_op.resultat:= 0;
            signalch(d.gemt_op.retur,gemt_op,d.gemt_op.optype);
            gemt_op:= 0;
            ventetid:= -1;
    <*+2*> if testbit15 and overvåget then
           disable begin
             write(zrl,<<zd dd dd.dd >,now,<:switch:     *Operation Timeout*:>);
             outchar(zrl,'nl');
           end;
    <*-2*>
          end;
        until false;
    tvswitch_trap:
        disable skriv_talevejsswitch(zbillede,1);
      end talevejsswitch;
    
    \f

    message garage_erklæringer side 1 - 810415/hko;
    
      zone array z_gar(max_antal_garageterminaler,16,1,gar_fejl);
    
      procedure gar_fejl(z,s,b);
        integer            s,b;
        zone             z;
      begin
        disable begin
          integer array iz(1:20);
          integer i,j,k;
          integer array field iaf;
          real array field raf;
    
          getzone6(z,iz);
          iaf:=raf:=2;
          getnumber(iz.raf,7,j);
    
          iaf:=(max_antal_operatører+j)*terminal_beskr_længde;
          k:=1;
    
          j:= terminal_tab.iaf.terminal_tilstand;
          if j shift(-21) < 6 and s <> (1 shift 21 +2) then
            fejlreaktion(17<*ydre enhed status*>,s,string iz.raf(increase(k)),
                         1 shift 12 <*binært*> +1 <*fortsæt*>);
          if s <> (1 shift 21 +2) then
            terminal_tab.iaf.terminal_tilstand:= 6 shift 21
              + terminal_tab.iaf.terminal_tilstand extract 21;
          if terminal_tab.iaf.terminal_tilstand shift(-21)<>0 then
          begin
            z(1):=real <:<'?'><'em'>:>;
            b:=2;
          end;
        end; <*disable*>
      end gar_fejl;
    
      integer cs_gar;
      integer array cs_garage(1:max_antal_garageterminaler);
    \f

    message procedure h_garage side 1 - 810520/hko;
    
      <* hovedmodulkorutine for garageterminaler *>
      procedure h_garage;
      begin
        integer array field op_ref;
        integer k,dest_sem;
        procedure skriv_hgarage(zud,omfang);
          value                     omfang;
          zone                  zud;
          integer                   omfang;
          begin integer i;
    
            i:=write(zud,"nl",1,<:+++ hovedmodul garage:>);
            write(zud,"sp",26-i);
            if omfang>0 then
            disable begin
              integer x;
              trap(slut);
              write(zud,"nl",1,
                <:  op_ref:    :>,op_ref,"nl",1,
                <:  k:         :>,k,"nl",1,
                <:  dest_sem:  :>,dest_sem,"nl",1,
                <::>);
              skriv_coru(zud,coru_no(300));
    slut:
            end;
         end skriv_hgarage;
    
      trap(hgar_trap);
      stack_claim(if cm_test then 198 else 146);
    
    <*+2*>
      if testbit16 and overvåget  or testbit28 then
        skriv_hgarage(out,0);
    <*-2*>
    \f

    message procedure h_garage side 2 - 811105/hko;
    
      repeat
        wait_ch(cs_gar,op_ref,true,-1);
    <*+4*>
        if (d.op_ref.optype and (gar_optype or gen_optype)) extract 12 =0
        then fejlreaktion(12<*operationstype*>,op_ref,<:garage:>,1);
    <*-4*>
    
        k:=d.op_ref.opkode extract 12;
        dest_sem:=
          if k=0 then cs_garage(d.op_ref.kilde mod 100) else
          if k=7 or k=8 then cs_garage(d.op_ref.data(1))
          else -1;
    <*+4*>
        if dest_sem=-1 then
        begin
          fejl_reaktion(2<*operationskode*>,k,<:hovedmodul garage:>,1);
          signal_ch(d.op_ref.retur,op_ref,d.op_ref.optype);
        end
        else
    <*-4*>
        if k=7<*inkluder*> then
        begin
          iaf:=(max_antal_operatører+ d.op_ref.data(1))*terminal_beskr_længde;
          if terminal_tab.iaf.terminal_tilstand shift(-21)=0 then
          begin
            d.op_ref.resultat:=3;
            signal_ch(d.op_ref.retur,op_ref,d.op_ref.optype);
            dest_sem:=-2;
          end;
        end
        else
        if k=8<*ekskluder*> then <*afbryd kommando v. timeout*>
        begin
          iaf:=(max_antal_operatører+d.op_ref.data(1))*terminal_beskr_længde;
          terminal_tab.iaf.terminal_tilstand:= 7 shift 21
            +terminal_tab.iaf.terminal_tilstand extract 21;
        end;
        if dest_sem>0 then
          signal_ch(dest_sem,op_ref,d.op_ref.optype);
      until false;
    
    hgar_trap:
      disable skriv_hgarage(zbillede,1);
      end h_garage;
    \f

    message procedure garage side 1 - 830310/cl;
    
      procedure garage(nr);
        value          nr;
        integer        nr;
      begin
        integer array field op_ref,ref;
        integer i,kode,aktion,status,opgave,retur_sem,
                pos,indeks,sep,sluttegn,vogn,ll;
    
        procedure skriv_garage(zud,omfang);
          value                    omfang;
          zone                 zud;
          integer                  omfang;
          begin integer i;
    
            i:=write(zud,"nl",1,<:+++ garage nr::>,nr);
            write(zud,"sp",26-i);
            if omfang > 0 then
            disable begin integer x;
              trap(slut);
              write(zud,"nl",1,
                <:  op-ref:    :>,op_ref,"nl",1,
                <:  kode:      :>,kode,"nl",1,
                <:  ref:       :>,ref,"nl",1,
                <:  i:         :>,i,"nl",1,
                <:  aktion:    :>,aktion,"nl",1,
                <:  retur-sem: :>,retur_sem,"nl",1,
                <:  vogn:      :>,vogn,"nl",1,
                <:  ll:        :>,ll,"nl",1,
                <:  status:    :>,status,"nl",1,
                <:  opgave:    :>,opgave,"nl",1,
                <:  pos:       :>,pos,"nl",1,
                <:  indeks:    :>,indeks,"nl",1,
                <:  sep:       :>,sep,"nl",1,
                <:  sluttegn:  :>,sluttegn,"nl",1,
                <::>);
              skriv_coru(zud,coru_no(300+nr));
    slut:
            end;
          end skriv_garage;
    \f

    message procedure garage side 2 - 830310/hko;
    
        trap(gar_trap);
        stack_claim((if cm_test then 200 else 146)+24+48+80+75);
    
        ref:= (max_antal_operatører+nr)*terminal_beskr_længde;
    
    <*+2*>
        if testbit16 and overvåget or testbit28 then
          skriv_garage(out,0);
    <*-2*>
    
    <* attention simulering
    *>
      if terminal_tab.ref.terminal_tilstand shift (-21) = 0 then
      begin
        wait_ch(cs_att_pulje,op_ref,true,-1);
        start_operation(op_ref,300+nr,cs_garage(nr),0);
        signal_ch(cs_garage(nr),op_ref,gen_optype);
      end;
    <*
    *>
    \f

    message procedure garage side 3 - 830310/hko;
    
        repeat
    
    <*V*> wait_ch(cs_garage(nr),
                  op_ref,
                  true,
                  -1<*timeout*>);
    <*+2*>
          if testbit17 and overvåget then
          disable begin
            write(out,"nl",1,<:operation fra cs:>,<<d>,cs_garage(nr),
                             <: til garage :>,nr);
            skriv_op(out,op_ref);
          end;
    <*-2*>
    
          kode:= d.op_ref.op_kode;
          retur_sem:= d.op_ref.retur;
          i:= terminal_tab.ref.terminal_tilstand;
          status:= i shift(-21);
          opgave:=
            if kode=0 then 1 <* indlæs kommando *> else
            if kode=7 then 2 <* inkluder        *> else
            if kode=8 then 3 <* ekskluder       *> else
            0; <* afvises *>
    
          aktion:= case status +1 of(
          <* status         *> <* opgave:         0   1   2   3 *>
          <* 0 klar         *>(case opgave+1 of(  0,  1, -4,  3)),
          <* 1 -            *>(-1),<* ulovlig tilstand *>
          <* 2 -            *>(-1),<* ulovlig tilstand *>
          <* 3 stoppet      *>(case opgave+1 of(  0,  2,  2,  3)),
          <* 4 noneksist    *>(-2),<* ulovligt garageterminalnr *>
          <* 5 -            *>(-1),<* ulovlig tilstand *>
          <* 6 stop v. fejl *>(case opgave+1 of(  0, -5,  2,  3)),
          <* 7 ej knyttet   *>(case opgave+1 of(  0, -5,  2,  3)),
                              -1);
    \f

    message procedure garage side 4 - 810424/hko;
    
          case aktion+6 of
          begin
            begin
              <*-5: terminal optaget *>
    
              d.op_ref.resultat:= 16;
              afslut_operation(op_ref,cs_att_pulje); <*telex*>
            end;
    
            begin
              <*-4: operation uden virkning *>
    
              afslut_operation(op_ref,-1);
            end;
    
            begin
              <*-3: ulovlig operationskode *>
    
              fejl_reaktion(2<*operationskode*>,kode,<:ulovlig:>,1);
              afslut_operation(op_ref,-1);
            end;
    
            begin
              <*-2: ulovligt garageterminal_nr *>
    
              fejl_reaktion(3<*programfejl*>,nr,<: ikke eksisterende garage:>,1);
              afslut_operation(op_ref,cs_att_pulje); <*telex*>
            end;
    
            begin
              <*-1: ulovlig operatørtilstand *>
    
              fejl_reaktion(3<*programfejl*>,status,<: ulovlig garage-status:>,1);
              afslut_operation(op_ref,-1);
            end;
    
            begin
              <* 0: ikke implementeret *>
    
              fejl_reaktion(2<*operationskode*>,kode,<: ikke implementeret:>,1);
              afslut_operation(op_ref,-1);
            end;
    
            begin
    \f

    message procedure garage side 5 - 851001/cl;
    
              <* 1: indlæs kommando *>
    
    
    <*V*>     læs_kommando(z_gar(nr),300+nr,op_ref,pos,indeks,sep,sluttegn);
    
              if d.op_ref.resultat > 3 then
              begin
    <*V*>       setposition(z_gar(nr),0,0);
                if sluttegn<>'nl' then outchar(z_gar(nr),'nl');
                skriv_kvittering(z_gar(nr),op_ref,pos,
                                 d.op_ref.resultat);
              end
              else if d.op_ref.resultat>0 then
              begin <*godkendt*>
                kode:=d.op_ref.opkode;
                i:= kode extract 12;
                j:= if kode=11 or kode=12 or kode=20 or kode=24 then 1
                    else if kode=9 or kode=10 then 2
                                         else 0;
                if j > 0 then
                begin
                  case j of
                  begin
                    begin
    \f

    message procedure garage side 6 - 851001/cl;
    
                      <* 1 indsæt/udtag/flyt bus i vogntabel *>
                      integer vogn,ll;
                      integer array field vtop;
    
                      vogn:=ia(1);
                      ll:=ia(2);
    <*V*>             wait_ch(cs_vt_adgang,
                              vt_op,
                              gen_optype,
                              -1<*timeout sek*>);
                      start_operation(vtop,300+nr,cs_garage(nr),
                                      kode);
                      d.vt_op.data(1):=vogn;
                      if kode=11 or kode=20 or kode=24 then d.vt_op.data(2):=ll;
                      indeks:= vt_op;
                      signal_ch(cs_vt,
                                vt_op,
                                gen_optype or gar_optype);
    
    <*V*>             wait_ch(cs_garage(nr),
                              vt_op,
                              gar_optype,
                              -1<*timeout sek*>);
    <*+2*>            if testbit18 and overvåget then
                      disable begin
                        write(out,"nl",1,<:garage :>,<<d>,nr,
                              <:: operation retur fra vt:>);
                        skriv_op(out,vt_op);
                      end;
    <*-2*>
    <*+4*>            if vt_op<>indeks then
                        fejl_reaktion(11<*fremmede op*>,op_ref,
                                      <:garage-kommando:>,0);
    <*-4*>
    <*V*>             setposition(z_gar(nr),0,0);
                      if sluttegn<>'nl' then outchar(z_gar(nr),'nl');
                      skriv_kvittering(z_gar(nr),if d.vt_op.resultat = 11 or
                        d.vt_op.resultat = 12 then d.vt_op.data(3)
                        else vt_op,-1,d.vt_op.resultat);
                      d.vt_op.optype:=gen_optype or vtoptype;
                      disable afslut_operation(vt_op,cs_vt_adgang);
                    end;
    
                    begin
    \f

    message procedure garage side 6a - 830310/cl;
    
                    <* 2 vogntabel,linienr/-,busnr *>
    
                    d.op_ref.retur:= cs_garage(nr);
                    tofrom(d.op_ref.data,ia,10);
                    indeks:= op_ref;
                    signal_ch(cs_vt,op_ref,gen_optype or gar_optype);
                    wait_ch(cs_garage(nr),
                            op_ref,
                            gar_optype,
                            -1<*timeout*>);
    <*+2*>          if testbit18 and overvåget then
                    disable begin
                      write(out,"nl",1,<:garage operation retur fra vt:>);
                      skriv_op(out,op_ref);
                    end;
    <*-2*>
    <*+4*>
                    if indeks <> op_ref then
                      fejlreaktion(11<*fremmed post*>,op_ref,<:garage komm:>,0);
    <*-4*>
                    i:= d.op_ref.resultat;
                    if i = 0 or i > 3 then
                    begin
    <*V*>             setposition(z_gar(nr),0,0);
                      skriv_kvittering(z_gar(nr),op_ref,-1,d.op_ref.resultat);
                    end
                    else
                    begin
                      integer antal,fil_ref;
                      antal:= d.op_ref.data(6);
                      fil_ref:= d.op_ref.data(7);
    <*V*>             setposition(z_gar(nr),0,0);
                      write(z_gar(nr),"*",24,"sp",6,
                        <:vogntabeludskrift:>,"sp",6,"*",24,"nl",2);
    <*V*>             setposition(z_gar(nr),0,0);
    \f

    message procedure garage side 6c - 841213/cl;
    
                      pos:= 1;
                      while pos <= antal do
                      begin
                        integer bogst,løb;
    
                        disable i:= læs_fil(fil_ref,pos,j);
                        if i <> 0 then
                          fejlreaktion(5<*læs_fil*>,i,<:garage: vo,l/vo,b:>,0)
                        else
                        begin
                          vogn:= fil(j,1) shift (-24) extract 24;
                          løb:= fil(j,1) extract 24;
                          if d.op_ref.opkode=9 then
                            begin i:=vogn; vogn:=løb; løb:=i; end;
                          ll:= løb shift (-12) extract 10;
                          bogst:= løb shift (-7) extract 5;
                          if bogst > 0 then bogst:= bogst +'A'-1;
                          løb:= løb extract 7;
                          vogn:= vogn extract 14;
                          i:= d.op_ref.opkode-8;
                          for i:= i,i+1 do
                          begin
                            j:= (i+1) extract 1;
                            case j +1 of
                            begin
                              write(z_gar(nr),"sp",(bogst=0) extract 1,<<ddd>,ll,
                                false add bogst,1,"/",1,<<d__>,løb);
                              write(z_gar(nr),<<dddd>,vogn,"sp",1);
                            end;
                          end;
                          if pos mod 5 = 0 then
                          begin
                            write(z_gar(nr),"nl",1);
    <*V*>                   setposition(z_gar(nr),0,0);
                          end
                          else write(z_gar(nr),"sp",3);
                        end;
                        pos:=pos+1;
                      end;
                      write(z_gar(nr),"nl",1,"*",77,"nl",1);
    \f

    message procedure garage side 6d- 830310/cl;
    
                      d.opref.opkode:=104; <*slet-fil*>
                      d.op_ref.data(4):=filref;
                      indeks:=op_ref;
                      signal_ch(cs_slet_fil,op_ref,gen_optype or gar_optype);
    <*V*>             wait_ch(cs_garage(nr),op_ref,gar_optype,-1);
    
    <*+2*>            if testbit18 and overvåget then
                      disable begin
                        write(out,"nl",1,<:garage, slet-fil retur:>);
                        skriv_op(out,op_ref);
                      end;
    <*-2*>
    
    <*+4*>            if op_ref<>indeks then
                        fejlreaktion(11<*fr.post*>,op_ref,<:garage,slet-fil:>,0);
    <*-4*>
                      if d.op_ref.data(9)<>0 then
                        fejl_reaktion(3<*prg.fejl*>,d.op_ref.data(9),
                            <:garage, slet_fil:>,1);
                    end;
    \f

    message procedure garage side 7 -810424/hko;
    
                    end;
    
    <*+4*>          fejl_reaktion(3<*programfejl*>,j,<:case 'opkode':>,2);
    <*-4*>
                  end;<*case j *>
                end <* j > 0 *>
                else
                begin
    <*V*>         setposition(z_gar(nr),0,0);
                  if sluttegn<>'nl' then outchar(z_gar(nr),'nl');
                  skriv_kvittering(z_gar(nr),op_ref,pos,
                                   4 <*kommando ukendt *>);
                end;
              end;<* godkendt *>
    
    <*V*>     setposition(z_gar(nr),0,0);
    
              d.op_ref.opkode:=0; <*telex*>
    
              disable afslut_operation(op_ref,cs_gar);
            end; <* indlæs kommando *>
    
            begin
    \f

    message procedure garage side 8 - 841213/cl;
    
                  <* 2: inkluder *>
    
              d.op_ref.resultat:=3;
              afslut_operation(op_ref,-1);
              monitor(8)reserve:(z_gar(nr),0,ia);
              terminal_tab.ref.terminal_tilstand:=
                terminal_tab.ref.terminal_tilstand extract 21;
    <*V*>     wait_ch(cs_att_pulje,op_ref,true,-1);
              start_operation(op_ref,300+nr,cs_att_pulje,0);
              signal_ch(cs_garage(nr),op_ref,gen_optype);
            end;
    
            begin
    
              <* 3: ekskluder *>
              d.op_ref.resultat:= 3;
              terminal_tab.ref.terminal_tilstand:= 7 shift 21 +
                terminal_tab.ref.terminal_tilstand extract 21;
              monitor(10)release:(z_gar(nr),0,ia);
              afslut_operation(op_ref,-1);
    
            end;
    
    <*+4*>  fejl_reaktion(3<*programfejl *>,aktion,<:case aktion:>,2);
    <*-4*>
          end; <* case aktion+6 *>
    
         until false;
      gar_trap:
        skriv_garage(zbillede,1);
      end garage;
    
    \f

    message procedure radio_erklæringer side 1 - 820304/hko;
    
    zone z_fr_in(14,1,rad_in_fejl),
         z_rf_in(14,1,rad_in_fejl),
         z_fr_out(14,1,rad_out_fejl),
         z_rf_out(14,1,rad_out_fejl);
    
    integer array
        radiofejl,
        ss_samtale_nedlagt,
        ss_radio_aktiver(1:max_antal_kanaler),
        bs_talevej_udkoblet,
        cs_radio(1:max_antal_taleveje),
        radio_linietabel(1:max_linienr//3+1),
        radio_områdetabel(0:max_antal_områder),
        opkaldskø(opkaldskø_postlængde//2+1:
          (max_antal_mobilopkald+1)*opkaldskø_postlængde//2),
        kanal_tab(1:max_antal_kanaler*kanal_beskr_længde//2),
        hookoff_maske(1:(tv_maske_lgd//2)),
        samtaleflag, kanalflag, opkaldsflag(1:(op_maske_lgd//2));
    
      integer field
        kanal_tilstand,
        kanal_id1,
        kanal_id2,
        kanal_spec,
        kanal_alt_id1,
        kanal_alt_id2;               
      integer array field 
        kanal_mon_maske,
        kanal_alarm,
        opkald_meldt;
    
      integer
        cs_rad,
        cs_radio_medd,
        cs_radio_adm,
        cs_radio_ind,
        cs_radio_ud,
        cs_radio_pulje,
        cs_radio_kø,
        bs_mobil_opkald,
        bs_opkaldskø_adgang,
        opkaldskø_ledige,
        nødopkald_brugt,
        første_frie_opkald,
        første_opkald,
        sidste_opkald,
        første_nødopkald,
        sidste_nødopkald,
        optaget_flag;
    
      boolean
        mobil_opkald_aktiveret;
    \f

    message procedure læs_hex_ciffer side 1 - 810428/hko;
    
      integer
      procedure læs_hex_ciffer(tabel,linie,op);
        value                      linie;
        integer array        tabel;
        integer                    linie,op;
        begin
          integer i,j;
    
          i:=(if linie>=0 then linie+6 else linie)//6;
          j:=((i-1)*6-linie)*4;
          læs_hex_ciffer:=op:=tabel(i) shift j extract 4;
       end læs_hex_ciffer;
    
    message procedure sæt_hex_ciffer side 1 - 810505/hko;
    
      integer
      procedure sæt_hex_ciffer(tabel,linie,op);
        value                      linie;
        integer array        tabel;
        integer                    linie,op;
        begin
          integer i,j;
    
          i:=(if linie>=0 then linie+6 else linie)//6;
          j:=(linie-(i-1)*6)*4;
          sæt_hex_ciffer:= tabel(i) shift (-j) extract 4;
          tabel(i):=tabel(i) shift (-4-j) shift 4 add (op extract 4)
                    shift j add (tabel(i) extract j);
        end sæt_hex_ciffer;
    
    message procedure hex_to_dec side 1 - 900108/cl;
    
    integer procedure hex_to_dec(hex);
      value                      hex;
      integer                    hex;
    begin
      hex_to_dec:= if 'A'<=hex and hex<='F' then (hex-'A'+10)
                   else (hex-'0');
    end;
    
    message procedure dec_to_hex side 1 - 900108/cl;
    
    integer procedure dec_to_hex(dec);
      value                      dec;
      integer                    dec;
    begin
      dec_to_hex:= if 0<=dec and dec<=9 then ('0'+dec)
                   else ('A'+dec-10);
    end;
    
    message procedure rad_out_fejl side 1 - 820304/hko;
    
      procedure rad_out_fejl(z,s,b);
        value                  s;
        zone                 z;
        integer                s,b;
        begin
          integer array field iaf;
          integer pos,tegn,max,i;
          integer array ia(1:20);
          long array field laf;
    
        disable begin
          laf:= iaf:= 2;
          tegn:= 1;
          getzone6(z,ia);
          max:= ia(16)//2*3;
          if s = 1 shift 21 + 2 then
          begin
            z(1):= real<:<'em'>:>;
            b:= 2;
          end
          else
          begin
            pos:= 0;
            for i:= 1 step 1 until max_antal_kanaler do
            begin
              iaf:= (i-1)*kanalbeskr_længde;
              if sæt_hex_ciffer(kanal_tab.iaf,3,15)<>15 then pos:= pos+1;
              if pos>0 then
              begin
                tofrom(kanalflag,alle_operatører,op_maske_lgd);
                signalbin(bs_mobilopkald);
                fejlreaktion(17<*y.e.status*>,s,string ia.laf(increase(tegn)),
                  1 shift 12<*binært*> +1<*fortsæt*>);
              end;
            end;
          end;
        end;
        end;
    \f

    message procedure rad_in_fejl side 1 - 810601/hko;
    
      procedure rad_in_fejl(z,s,b);
        value                 s;
        zone                z;
        integer               s,b;
        begin
          integer array field iaf;
          integer pos,tegn,max,i;
          integer array ia(1:20);
          long array field laf;
    
        disable begin
          laf:= iaf:= 2;
          i:= 1;
          getzone6(z,ia);
          max:= ia(16)//2*3;
          if s shift (-21) extract 1 = 0
             and s shift(-19) extract 1 = 0 then
          begin
            if b = 0 then
            begin
              z(1):= real<:!:>;
              b:= 2;
            end;
          end;
    \f

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

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

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

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

    message procedure skriv_radio_linietabel side 1 - 820301/hko;
    
      procedure skriv_radio_linie_tabel(z);
        zone                               z;
        begin
          integer i,j,k;
    
          write(z,"nl",2,"*",5,<: liniefordeling for operatører :>,"*",5,"nl",2);
          k:= 0;
          for i:= 1 step 1 until max_linienr do
          begin
            læstegn(radio_linietabel,i+1,j);
            if j > 0 then
            begin
              k:= k +1;
              write(z,<<dddd>,i,":",1,<<zd_>,j,"sp",if k mod 5=0 then 0 else 4,
                "nl",if k mod 5=0 then 1 else 0);
            end;
          end;
          write(z,"nl",if k mod 5=0 then 1 else 2);
        end skriv_radio_linietabel;
    
    procedure skriv_radio_områdetabel(z);
     zone                             z;
      begin
        integer i;
    
        write(z,"nl",2,"*",5,<: områdefordeling for operatører :>,"*",5,"nl",2);
        for i:= 1 step 1 until max_antal_områder do
        begin
          laf:= (i-1)*4;
          if radio_områdetabel(i)<>0 then
            write(z,<<dd>,i,<:. :>,områdenavn.laf,<:: :>,
              radio_områdetabel(i),"nl",1);
        end;
      end skriv_radio_områdetabel;
    \f

    message procedure h_radio side 1 - 810520/hko;
    
      <* hovedmodulkorutine for radiokanaler *>
      procedure h_radio;
      begin
        integer array field op_ref;
        integer k,dest_sem;
        procedure skriv_hradio(z,omfang);
          value                  omfang;
          zone                 z;
          integer                omfang;
          begin integer i;
            disable i:= write(z,"nl",1,<:+++ hovedmodul radio:>);
            write(z,"sp",26-i);
            if omfang >0 then
            disable begin integer x;
              trap(slut);
              write(z,"nl",1,
                <:  op_ref:    :>,op_ref,"nl",1,
                <:  k:         :>,k,"nl",1,
                <:  dest_sem:  :>,dest_sem,"nl",1,
                <::>);
              skriv_coru(z,coru_no(400));
    slut:
            end;
          end skriv_hradio;
    
      trap(hrad_trap);
      stack_claim(if cm_test then 198 else 146);
    
    <*+2*> if testbit32 and overvåget or testbit28 then
        skriv_hradio(out,0);
    <*-2*>
    \f

    message procedure h_radio side 2 - 820304/hko;
    
      repeat
        wait_ch(cs_rad,op_ref,true,-1);
    <*+2*>if testbit33 and overvåget then
          disable begin
            skriv_h_radio(out,0);
            write(out,<: operation modtaget:>);
            skriv_op(out,op_ref);
          end;
    <*-2*>
    <*+4*>
        if (d.op_ref.optype and
             (gen_optype or rad_optype or vt_optype)) extract 12 =0
        then fejlreaktion(12<*operationstype*>,op_ref,<:h<'_'>radio:>,1);
    <*-4*>
    
        k:=d.op_ref.op_kode extract 12;
        dest_sem:=
          if k > 0 and k < 7
             or k=11 or k=12 or k=19
             or (72<=k and k<=74) or k = 77
             <*IN,O/EK,O/IN,R/EK,R/FO,L/ST/EK,K/IN,K/RA,I/FO,O*>
          then cs_radio_adm
          else if k=41 <* radiokommando fra operatør *>
          then cs_radio(d.opref.data(1)) else -1;
    <*+4*>
        if dest_sem<1 then
        begin
          if dest_sem<0 then
            fejlreaktion(2<*operationskode*>,k,<:hovedmodul radio:>,1);
          d.op_ref.resultat:= if dest_sem=0 then 45 else 31;
          signal_ch(d.op_ref.retur,op_ref,d.op_ref.optype);
        end
        else
    <*-4*>
        begin <* operationskode ok *>
          signal_ch(dest_sem,op_ref,d.op_ref.optype);
        end;
      until false;
    
    hrad_trap:
      disable skriv_hradio(zbillede,1);
      end h_radio;
    \f

    message procedure radio side 1 - 820301/hko;
    
      procedure radio(talevej,op);
      value           talevej,op;
      integer         talevej,op;
        begin
          integer array field opref, rad_op, vt_op, opref1, iaf, iaf1;
          integer nr,i,j,k,res,opgave,tilst,tekn_inf, vtop2, vtop3,
                  sig,omr,type,bus,ll,ttmm,vogn,garage,operatør;
          integer array felt,værdi(1:8);
          boolean byt,nød,frigiv_samtale;
          real kl;
          real field rf;
    
          procedure skriv_radio(z,omfang);
            value                 omfang;
            zone                z;
            integer               omfang;
            begin integer i1;
              disable i1:= write(z,"nl",1,<:+++ radio:>);
              write(z,"sp",26-i1);
              if omfang > 0 then
              disable begin real x;
                trap(slut);
    \f

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

    message procedure udtag_opkald side 1 - 820301/hko;
    
      integer
      procedure udtag_opkald(vogn,type,operatør,bus,garage,omr,sig,ll,ttmm);
        value                vogn,     operatør;
        integer              vogn,type,operatør,bus,garage,omr,sig,ll,ttmm;
        begin
          integer res,tilst,nr,i,j,t,o,b,l,tm;
          integer array field vt_op,ref,næste,forrige;
          integer array field iaf1;
          boolean skal_ud;
    
          boolean procedure skal_udskrives(fordelt,aktuel);
            value                          fordelt,aktuel;
            integer                        fordelt,aktuel;
          begin
            boolean skal;
            integer n;
            integer array field iaf;
    
            skal:= true;
            if fordelt > 0 and fordelt<>aktuel then
            begin
              for n:= 0 step 1 until 3 do
              begin
                if bpl_tilst(operatør_stop(fordelt,n),1) > 0 then
                begin
                  iaf:= operatør_stop(fordelt,n)*op_maske_lgd;
                  skal:= læsbit_ia(bpl_def.iaf,aktuel);
                  goto returner;
                end;
              end;
            end;
    returner:
            skal_udskrives:= skal;
          end;
    
          l:= b:= tm:= t:= 0;
          garage:= sig:= 0;
          res:= -1;
    <*V*> wait(bs_opkaldskø_adgang);
          ref:= første_nødopkald;
          if ref <> 0 then
            t:= 2
          else
          begin
            ref:= første_opkald;
            t:= if ref = 0 then 0 else 1;
          end;
          if t = 0 then res:= +19 <*kø er tom*> else
          if vogn=0 and omr=0 then
          begin
            while ref <> 0 and res = -1 do
            begin
              nr:= opkaldskø.ref(4) extract 8;
              if nr>64 then
              begin 
                <*opk. primærfordelt til gruppe af btj.pl.*>
                i:=0; skal_ud:=true; iaf1:=nr*op_maske_lgd;
                while skal_ud and i<max_antal_operatører do
                begin
                  i:=i+1;
                  if læsbit_ia(bpl_def.iaf1,i) then
                    skal_ud:= skal_ud and skal_udskrives(i,operatør);
                end;
              end
              else
                skal_ud:= skal_udskrives(nr,operatør);
    
              if skal_ud then
    <*        if nr=0 or -,læsbit_ia(operatørmaske,nr) or nr=operatør then
    *>
                res:= 0
              else
              begin
                ref:= opkaldskø.ref(1) extract 12;
                if ref = 0 and t = 2 then
                begin
                  ref:= første_opkald;
                  t:= if ref = 0 then 0 else 1;
                end else if ref = 0 then t:= 0;
              end;
            end; <*while*>
    \f

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

    message procedure udtag_opkald side 3 - 810603/hko;
    
            if ref <> 0 then
            begin
              b:= nr;
              tm:= opkaldskø.ref(4);
              o:= tm extract 8;
              tm:= tm shift(-12);
              omr:= opkaldskø.ref(5) extract 4;
              sig:= opkaldskø.ref(5) shift (-20);
    
    <*+4*>    if tilst <> -1 then
                fejlreaktion(3<*prg.fejl*>,tilst,
                  <:vogntabel_tilstand for vogn i kø:>,1);
    <*-4*>
            end;
          end;
    
          if ref <> 0 then
          begin
            næste:= opkaldskø.ref(1);
            forrige:= næste shift(-12);
            næste:= næste extract 12;
            if forrige <> 0 then
              opkaldskø.forrige(1):= opkaldskø.forrige(1) shift(-12) shift 12
                                     + næste
            else if t = 1 then første_opkald:= næste
            else <*if t = 2 then*> første_nødopkald:= næste;
    
            if næste <> 0 then
              opkaldskø.næste(1):= opkaldskø.næste(1) extract 12
                                   + forrige shift 12
            else if t = 1 then sidste_opkald:= forrige
            else <* if t = 2 then*> sidste_nødopkald:= forrige;
    
            opkaldskø.ref(1):=første_frie_opkald;
            første_frie_opkald:=ref;
    
            opkaldskø_ledige:=opkaldskø_ledige + 1;
            if t=2 then nødopkald_brugt:=nødopkald_brugt - 1;
            if -,læsbit_ia(operatør_maske,o) or o = 0 then
              tofrom(opkaldsflag,alle_operatører,op_maske_lgd)
            else
            begin
              sætbit_ia(opkaldsflag,operatør,1);
              sætbit_ia(opkaldsflag,o,1);
            end;
            signal_bin(bs_mobil_opkald);
          end;
    \f

    message procedure udtag_opkald side 4 - 810531/hko;
    
          signal_bin(bs_opkaldskø_adgang);
          bus:= b;
          type:= t;
          ll:= l;
          ttmm:= tm;
          udtag_opkald:= res;
        end udtag opkald;
    \f

    message procedure frigiv_kanal side 1 - 810603/hko;
    
      procedure frigiv_kanal(nr);
        value                nr;
        integer              nr;
        begin
          integer id1, id2, omr, i;
          integer array field iaf, vt_op;
    
          iaf:= (nr-1)*kanal_beskrlængde;
          id1:= kanal_tab.iaf.kanal_id1;
          id2:= kanal_tab.iaf.kanal_id2;
          omr:= kanal_til_omr(nr);
          if id1 <> 0 then
            wait(ss_samtale_nedlagt(nr));
          if id1 shift (-22) < 3 and omr > 2 then
          begin
    <*V*>   waitch(cs_vt_adgang,vt_op,true,-1);
            start_operation(vt_op,410+talevej,cs_radio(talevej),
              if id1 shift (-22) = 2 then 18 else 17);
            d.vt_op.data(1):= id1;
            d.vt_op.data(4):= omr;
            signalch(cs_vt,vt_op,vt_optype or genoptype);
    <*V*>   waitch(cs_radio(talevej),vt_op,vt_optype,-1);
            signalch(cs_vt_adgang,vt_op,true);
          end;
    
          if id2 <> 0 and id2 shift(-20) <> 12 then
            wait(ss_samtale_nedlagt(nr));
          if id2 shift (-22) < 3 and omr > 2 then
          begin
    <*V*>   waitch(cs_vt_adgang,vt_op,true,-1);
            start_operation(vt_op,410+talevej,cs_radio(talevej),
              if id2 shift (-22) = 2 then 18 else 17);
            d.vt_op.data(1):= id2;
            d.vt_op.data(4):= omr;
            signalch(cs_vt,vt_op,vt_optype or genoptype);
    <*V*>   waitch(cs_radio(talevej),vt_op,vt_optype,-1);
            signalch(cs_vt_adgang,vt_op,true);
          end;
    
          kanal_tab.iaf.kanal_id1:= kanal_tab.iaf.kanal_id2:= 
          kanal_tab.iaf.kanal_alt_id1:= kanal_tab.iaf.kanal_alt_id2:= 0;
          kanal_tab.iaf.kanal_tilstand:= kanal_tab.iaf.kanal_tilstand
                                        shift (-10) extract 6 shift 10;
    <*    repeat
            inspect(ss_samtale_nedlagt(nr),i);
            if i>0 then wait(ss_samtale_nedlagt(nr));
          until i<=0;
    *>
        end frigiv_kanal;
    \f

    message procedure hookoff side 1 - 880901/cl;
    
    integer procedure hookoff(talevej,op,retursem,flash);
    value                     talevej,op,retursem,flash;
    integer                   talevej,op,retursem;
    boolean                                        flash;
    begin
      integer array field opref;
    
      opref:= op;
      start_operation(opref,410+talevej,retursem,'A' shift 12 + 60);
      d.opref.data(1):= talevej;
      d.opref.data(2):= if flash then 2 else 1;
      signalch(cs_radio_ud,opref,rad_optype);
    <*V*> waitch(retursem,opref,rad_optype,-1);
      hookoff:= d.opref.resultat;
    end;
    \f

    message procedure hookon side 1 - 880901/cl;
    
    integer procedure hookon(talevej,op,retursem);
      value                  talevej,op,retursem;
      integer                talevej,op,retursem;
    begin
      integer i,res;
      integer array field opref;
    
     if læsbit_ia(hookoff_maske,talevej) then
     begin
      inspect(bs_talevej_udkoblet(talevej),i);
      if i<=0 then
      begin
        opref:= op;
        start_operation(opref,410+talevej,retursem,'D' shift 12 + 60);
        d.opref.data(1):= talevej;
        signalch(cs_radio_ud,opref,rad_optype);
    <*V*> waitch(retursem,opref,rad_optype,-1);
        res:= d.opref.resultat;
      end
      else
        res:= 0;
    
      if res=0 then wait(bs_talevej_udkoblet(talevej));
     end
     else
       res:= 0;
    
     sætbit_ia(hookoff_maske,talevej,0);
      hookon:= res;
    end;
    \f

    message procedure radio side 2 - 820304/hko;
    
          rad_op:= op;
    
          trap(radio_trap);
          stack_claim((if cm_test then 200 else 150) +200);
    
    <*+2*>if testbit32 and overvåget or testbit28 then
            skriv_radio(out,0);
    <*-2*>
          repeat
            waitch(cs_radio(talevej),opref,true,-1);
    <*+2*>
            if testbit33 and overvåget then
            disable begin
              skriv_radio(out,0);
              write(out,<: operation modtaget på cs:>,<<d>,cs_radio(talevej));
              skriv_op(out,opref);
            end;
    <*-2*>
    
            k:= d.op_ref.opkode extract 12;
            opgave:= d.opref.opkode shift (-12);
            operatør:= d.op_ref.data(4);
    
    <*+4*>  if (d.op_ref.optype and (gen_optype or io_optype or op_optype))
              extract 12 = 0 then fejlreaktion(12<*operationstype*>,op_ref,
                                    <:radio:>,0);
    <*-4*>
    \f

    message procedure radio side 3 - 880930/cl;
            if k=41 <*radiokommando fra operatør*> then
            begin
              vogn:= d.opref.data(2);
              res:= -1;
              for i:= 7 step 1 until 12 do d.opref.data(i):= 0;
              sig:= 0; omr:= d.opref.data(3) extract 8;
              bus:= garage:= ll:= 0;
    
              if opgave=1 or opgave=9 then
              begin <* opkald til enkelt vogn (CHF) *>
                res:= udtag_opkald(vogn,type,operatør,bus,garage,omr,sig,ll,ttmm);
                if res=19 and (vogn<>0 or d.opref.data(3)=2) then res:= -1;
                <* ok at kø er tom når vogn er angivet eller VHF *>
                
                d.opref.data(11):= if res=0 then 
                  (if ll<>0 then ll else bus) else vogn;
    
                if type=2 <*nød*> then
                begin
                  waitch(cs_radio_pulje,opref1,true,-1);
                  start_operation(opref1,410+talevej,cs_radio_pulje,46);
                  d.opref1.data(1):= if ll<>0 then ll else bus;
                  systime(5,0,kl);
                  d.opref1.data(2):= entier(kl/100.0);
                  d.opref1.data(3):= omr;
                  signalch(cs_io,opref1,gen_optype or rad_optype);
                end
              end; <* enkeltvogn (CHF) *>
    
              <* check enkeltvogn for ledig *>
              if res<=0 and omr=2<*VHF*> and bus=0 and
                 (opgave=1 or opgave=9) then
              begin
                for i:= 1 step 1 until max_antal_kanaler do
                  if kanal_til_omr(i)=2 then nr:= i;
                iaf:= (nr-1)*kanalbeskrlængde;
                if kanal_tab.iaf.kanal_tilstand extract 2<>0 and 
                   kanal_tab.iaf.kanal_id1 extract 20 = 10000
                then res:= 52;
              end;
              if res < 0 and (d.opref.data(3) > 2 <* ej TLF, VHF *> or
                d.opref.data(3)=0 <*std. omr*>) and
                (opgave <= 2 <* OP elller ME *> or opgave = 9 <* OP,L *>)
              then
              begin
                type:= ttmm:= 0; omr:= 0; sig:= 0;
                if vogn shift (-22) = 1 then
                begin
                  find_busnr(vogn,bus,garage,res);
                  ll:= vogn;
                end
                else
                if vogn shift (-22) = 0 then
                begin
                  søg_omr_bus(vogn,ll,garage,omr,sig,res);
                  bus:= vogn;
                end
                else
                  fejlreaktion(31,vogn,<:vognident i enkeltvognsopk.:>,0);
                res:= if res=(-1) then 18 <* i kø *> else 
                      (if res<>0 then 14 <*opt*> else 0);
              end
              else
              if res<0 and (d.opref.data(3)=1 or d.opref.data(3)=2) and
                opgave <= 2 then
              begin
                bus:= vogn; garage:= type:= ttmm:= 0;
                res:= 0; omr:= 0; sig:= 0;
              end
              else
              if opgave>1 and opgave<>9 then
                type:= ttmm:= res:= 0;
    \f

    message procedure radio side 4 - 880930/cl;
    
              if res=0 and (opgave<=4 or opgave=9) and
                (omr<1 or 2<omr) and
                (d.opref.data(3)>2 or d.opref.data(3)=0) then
              begin <* reserver i vogntabel *>
                waitch(cs_vt_adgang,vt_op,true,-1);
                start_operation(vt_op,410+talevej,cs_radio(talevej),
                  if opgave <=2 or opgave=9 then 15 else 16);
                d.vt_op.data(1):= if opgave<=2 or opgave=9 then
                  (if vogn=0 then garage shift 14 + bus else 
                   if ll<>0 then ll else garage shift 14 + bus)
                  else vogn <*gruppeid*>;
                d.vt_op.data(4):= if d.opref.data(3)<>0 then
                                    d.opref.data(3) extract 8
                                  else omr extract 8;
                signalch(cs_vt,vt_op,gen_optype or rad_optype);
    <*V*>       waitch(cs_radio(talevej),vt_op,rad_optype,-1);
    
                res:= d.vt_op.resultat;
                if res=3 then res:= 0;
                vtop2:= d.vt_op.data(2);
                vtop3:= d.vt_op.data(3);
                tekn_inf:= d.vt_op.data(4);
                signalch(cs_vt_adgang,vt_op,gen_optype or vt_optype);
              end;
    
              if res<>0 then
              begin
                d.opref.resultat:= res;
                signalch(d.opref.retur,opref,d.opref.optype);
              end
              else
    
              if opgave <= 9 then
              begin <* opkald *>
                res:= hookoff(talevej,rad_op,cs_radio(talevej),
                    opgave<>9 and d.opref.data(6)<>0);
    
                if res<>0 then
                  goto returner_op;
    
                if opgave=7 or opgave=8 then <* KATASTROFEOPKALD *>
                begin
                  start_operation(rad_op,410+talevej,cs_radio(talevej),
                    'H' shift 12 + 60);
                  d.rad_op.data(1):= talevej;
                  d.rad_op.data(2):= 'D';
                  d.rad_op.data(3):= 6; <* rear *>
                  d.rad_op.data(4):= 1; <* rear no *>
                  d.rad_op.data(5):= 0; <* disconnect *>
                  signalch(cs_radio_ud,rad_op,rad_optype);
    <*V*>         waitch(cs_radio(talevej),rad_op,rad_optype,-1);
                  if d.rad_op.resultat<>0 then
                  begin
                    res:= d.rad_op.resultat;
                    goto returner_op;
                  end;
    <*
                  while optaget_flag shift (-1) <> 0 do
                    delay(1);
    *>
                end;
    \f

    message procedure radio side 5 - 880930/cl;
    
                start_operation(rad_op,410+talevej,cs_radio(talevej),
                  'B' shift 12 + 60);
                d.rad_op.data(1):= talevej;
                d.rad_op.data(2):= 'D';
                d.rad_op.data(3):= if opgave=9 then 3 else
                                   (2 - (opgave extract 1)); <* højttalerkode *>
    
                if 5<=opgave and opgave <=8 then <* ALLE KALD *>
                begin
                  j:= 0;
                  for i:= 2 step 1 until max_antal_områder do
                  begin
                    if opgave > 6 or
                      (d.opref.data(3) shift (-20) = 15 and
                       læsbiti(d.opref.data(3),i)) or
                      (d.opref.data(3) shift (-20) = 14 and
                       d.opref.data(3) extract 20  =  i)
                    then
                    begin
                      for k:= 1 step 1 until (if i=3 then 2 else 1) do
                      begin
                        j:= j+1;
                        d.rad_op.data(10+(j-1)*2):=
                          område_id(i,2) shift 12 +         <* tkt, tkn *>
                          (if i=2<*VHF*> then 4 else k) 
                                               shift 8 +   <* signal type *>
                                                      1;    <* antal tno *>
                        d.rad_op.data(11+(j-1)*2):= 0;      <* tno alle *>
                      end;
                    end;
                  end;
                  d.rad_op.data(4):= j;
                  d.rad_op.data(5):= 0;
                end
                else
                if opgave>2 and opgave <= 4 then <* gruppekald *>
                begin
                  d.rad_op.data(4):= vtop2;
                  d.rad_op.data(5):= vtop3;
                end
                else
                begin <* enkeltvogn *>
                  if omr=0 then
                  begin
                    sig:= tekn_inf shift (-23);
                    omr:= if d.opref.data(3)<>0 then d.opref.data(3)
                          else tekn_inf extract 8;
                  end
                  else
                  if d.opref.data(3)<>0 then omr:= d.opref.data(3);
    
                  <* lytte-kald til nød i TCT, VHF og TLF *>
                  <* tvinges til alm. opkald              *>
                  if (opgave=9) and (type=2) and (omr<=3) then
                  begin
                    d.opref.opkode:= 1 shift 12 + d.opref.opkode extract 12;
                    opgave:= 1;
                    d.radop.data(3):= 1;
                  end;
    
                  if omr=2 <*VHF*> then sig:= 4 else
                  if omr=1 <*TLF*> then sig:= 7 else
                           <*UHF*>      sig:= sig+1;
                  d.rad_op.data(4):= 1;
                  d.rad_op.data(5):= 0;
                  d.rad_op.data(10):=
                     (område_id(omr,2) extract 12) shift 12  +
                                      sig shift 8 +
                                      1;
                  d.rad_op.data(11):= bus;
                end;
    \f

    message procedure radio side 6 - 880930/cl;
    
                signalch(cs_radio_ud,rad_op,rad_optype);
    <*V*>       waitch(cs_radio(talevej),rad_op,rad_optype,-1);
                res:= d.rad_op.resultat;
    
                d.rad_op.data(6):= 0;
                for i:= 1 step 1 until max_antal_områder do
                  if læsbiti(d.rad_op.data(7),i) then 
                    increase(d.rad_op.data(6));
    returner_op:
                if d.rad_op.data(6)=1 then
                begin
                  for i:= 1 step 1 until max_antal_områder do
                    if d.rad_op.data(7) extract 20 = 1 shift i then
                      d.opref.data(12):= 14 shift 20 + i;
                end
                else
                  d.opref.data(12):= 15 shift 20 + d.rad_op.data(7) extract 20;
                d.opref.data(7):= type;
                d.opref.data(8):= garage shift 14 + bus;
                d.opref.data(9):= ll;
                if res=0 then
                begin
                  d.opref.resultat:= 3;
                  d.opref.data(5):= d.opref.data(6);
                  j:= 0;
                  for i:= 1 step 1 until max_antal_kanaler do
                    if læsbiti(d.rad_op.data(9),i) then j:= j+1;
                  if j>1 then
                    d.opref.data(6):= 3 shift 22 + 1 shift 20 + d.rad_op.data(9)
                  else
                  begin
                    j:= 0;
                    for i:= 1 step 1 until max_antal_kanaler do
                      if læsbiti(d.rad_op.data(9),i) then j:= i;
                    d.opref.data(6):= 3 shift 22 + j;
                  end;
                  d.opref.data(7):= type;
                  d.opref.data(8):= garage shift 14 + bus;
                  d.opref.data(9):= ll;
                  d.opref.data(10):= d.opref.data(6);
                  for i:= 1 step 1 until max_antal_kanaler do
                  begin
                    if læsbiti(d.rad_op.data(9),i) then
                    begin
                      if kanal_id(i) shift (-5) extract 5 = 2 then
                        j:= pabx_id( kanal_id(i) extract 5 )
                      else
                        j:= radio_id( kanal_id(i) extract 5 );
                      if j>0 and type=0 and operatør>0 then tæl_opkald(j,1);
    
                      iaf:= (i-1)*kanalbeskrlængde;
                      skrivtegn(kanal_tab.iaf,1,talevej);
                      kanal_tab.iaf.kanal_id2:= kanal_tab.iaf.kanal_id1;
                      kanal_tab.iaf.kanal_alt_id2:= kanal_tab.iaf.kanal_alt_id1;
                      kanal_tab.iaf.kanal_id1:=
                        if opgave<=2 or opgave=9 then
                          d.opref.data(if d.opref.data(9)<>0 then 9 else 8)
                        else
                          d.opref.data(2);
                      kanal_tab.iaf.kanal_alt_id1:=
                        if opgave<=2 or opgave=9 then
                          d.opref.data(if d.opref.data(9)<>0 then 8 else 9)
                        else
                          0;
                      if kanal_tab.iaf.kanal_id1=0 then
                        kanal_tab.iaf.kanal_id1:= 10000;
                      kanal_tab.iaf.kanal_spec:=
                         if opgave <= 2 or opgave = 9 then ttmm else 0;
                    end;
                  end;
                  if 5<=opgave and opgave<=8 <*alle-/katastrofekald*> then
                    sætbit_ia(kanalflag,operatør,1);
    \f

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

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

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

    message procedure radio side 10 - 880930/cl;
    
              end <* MONITERING *>
              else
              if opgave = 11 then <* GENNEMSTILLING *>
              begin
                nr:= d.opref.data(6) extract 20;
                k:= if d.opref.data(5) shift (-20) = 12 then
                      d.opref.data(5) extract 20
                    else
                      0;
                inspect(ss_samtale_nedlagt(nr),i);
                if k<>0 then inspect(ss_samtale_nedlagt(k),j) else j:=0;
                if i<>0 and j<>0 then
                begin
                  res:= hookon(talevej,rad_op,cs_radio(talevej));
                  goto radio_nedlæg;
                end;
    
                iaf:= (nr-1)*kanal_beskr_længde;
                if kanal_tab.iaf.kanal_tilstand shift (-16) = talevej then
                begin
                  if læsbiti(kanal_tab.iaf.kanal_tilstand,5) and
                     kanal_tab.iaf.kanal_tilstand extract 2 = 3
                  then
                    res:= hookoff(talevej,rad_op,cs_radio(talevej),true)
                  else
                  if kanal_tab.iaf.kanal_tilstand extract 2 = 1 and
                     d.opref.data(5)<>0
                  then
                    res:= 0
                  else
                    res:= 21; <* ingen at gennemstille til *>
                end
                else
                  res:= 50; <* kanalnr *>
    
                if res=0 then
                  res:= hookon(talevej,rad_op,cs_radio(talevej));
                if res=0 then
                begin
                  sætbiti(kanal_tab.iaf.kanal_tilstand,5,0);
                  kanal_tab.iaf.kanal_tilstand:=
                    kanal_tab.iaf.kanal_tilstand shift (-2) shift 2 + 3;
                  d.opref.data(6):= 0;
                  if kanal_tab.iaf.kanal_id2=0 then
                    kanal_tab.iaf.kanal_id2:= d.opref.data(5);
    
                  if kanal_tab.iaf.kanal_id2 shift (-22) = 3 then
                  begin <* gennemstillet til anden kanal *>
                    iaf1:= ((kanal_tab.iaf.kanal_id2 extract 20) - 1)
                                                            *kanalbeskrlængde;
                    sætbiti(kanal_tab.iaf1.kanal_tilstand,5,0);
                    kanal_tab.iaf1.kanal_tilstand:=
                      kanal_tab.iaf1.kanal_tilstand shift (-2) shift 2 + 3;
                    if kanal_tab.iaf1.kanal_id2=0 then
                      kanal_tab.iaf1.kanal_id2:= 12 shift 20 + nr;
                  end;
                  d.opref.data(5):= 0;
    
                  res:= 3;
                end;
    
                d.opref.resultat:= res;
                signalch(d.opref.retur,opref,d.opref.optype);
    \f

    message procedure radio side 11 - 880930/cl;
    
              end
              else
              if opgave = 12 then <* NEDLÆG *>
              begin
                res:= hookon(talevej,rad_op,cs_radio(talevej));
    radio_nedlæg:
                if res=0 then
                begin
                 for k:= 5, 6  do
                 begin
                  if d.opref.data(k) shift (-20) = 12 then
                  begin
                    i:= d.opref.data(k) extract 20;
                    iaf:= (i-1)*kanalbeskrlængde;
                    if kanal_tab.iaf.kanal_tilstand shift (-16) = talevej then
                      frigiv_kanal(d.opref.data(k) extract 20)
                    else
                      sætbit_ia(kanal_tab.iaf.kanal_mon_maske,talevej,0);
                  end
                  else
                  if d.opref.data(k) shift (-20) = 13 then
                  begin
                    for i:= 1 step 1 until max_antal_kanaler do
                      if læsbiti(d.opref.data(k),i) then
                      begin
                        iaf:= (i-1)*kanalbeskrlængde;
                        if kanal_tab.iaf.kanal_tilstand shift (-16) = talevej then
                          frigiv_kanal(i)
                        else
                          sætbit_ia(kanal_tab.iaf.kanal_mon_maske,talevej,0);
                      end;
                    sætbit_ia(kanalflag,operatør,1);
                  end;
                 end;
                  d.opref.data(5):= 0;
                  d.opref.data(6):= 0;
                  d.opref.data(9):= 0;
                  res:= if opgave=12 then 3 else 49;
                end;
                d.opref.resultat:= res;
                signalch(d.opref.retur,opref,d.opref.optype);
              end
              else
              if opgave=13 then <* R *>
              begin
                startoperation(rad_op,410+talevej,cs_radio(talevej),
                  'H' shift 12 + 60);
                d.rad_op.data(1):= talevej;
                d.rad_op.data(2):= 'M';
                d.rad_op.data(3):= 0; <*tkt*>
                d.rad_op.data(4):= 0; <*tkn*>
                d.rad_op.data(5):= 1 - (d.opref.data(2) extract 1);
                signalch(cs_radio_ud,rad_op,rad_optype);
    <*V*>       waitch(cs_radio(talevej),rad_op,rad_optype,-1);
                res:= d.rad_op.resultat;
                d.opref.resultat:= if res=0 then 3 else res;
                signalch(d.opref.retur,opref,d.opref.optype);
              end
              else
              if opgave=14 <* VENTEPOS *> then
              begin
                res:= 0;
                while (res<=3 and d.opref.data(2)>0) do
                begin
                  nr:= d.opref.data(6) extract 20;
                  k:= if d.opref.data(5) shift (-20) = 12 then
                        d.opref.data(5) extract 20
                      else
                        0;
                  inspect(ss_samtale_nedlagt(nr),i);
                  if k<>0 then inspect(ss_samtale_nedlagt(k),j) else j:= 0;
                  if i<>0 or j<>0 then
                  begin
                    res:= hookon(talevej,radop,cs_radio(talevej));
                    goto radio_nedlæg;
                  end;
    
                  res:= hookoff(talevej,radop,cs_radio(talevej),true);
    
                  if res=0 then
                  begin
                    i:= d.opref.data(5);
                    d.opref.data(5):= d.opref.data(6);
                    d.opref.data(6):= i;
                    res:= 3;
                  end;
    
                  d.opref.data(2):= d.opref.data(2)-1;
                end;
                d.opref.resultat:= res;
                signalch(d.opref.retur,opref,d.opref.optype);
              end
              else
              begin
                fejlreaktion(2,opgave,<: radioopgave fra operatør:>,1);
                d.opref.resultat:= 31;
                signalch(d.opref.retur,opref,d.opref.optype);
              end;
    
            end <* radiokommando fra operatør *>
            else
            begin
    
              d.op_ref.resultat:= 45; <* ikke implementeret *>
    
              signal_ch(d.op_ref.retur,op_ref,d.op_ref.optype);
    
            end;
              
          until false;
    radio_trap:
          disable skriv_radio(zbillede,1);
        end radio;
    \f

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

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

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

    message procedure indsæt_opkald side 2 - 820304/hko;
    
              if d.vt_op.resultat = 3 then
              begin
                ll:= d.vt_op.data(2);
                tilst:= d.vt_op.data(3);
                læstegn(radio_linietabel,(ll shift (-12) extract 10)+1,operatør);
                if operatør < 0 or max_antal_operatører < operatør then
                  operatør:= 0;
                if operatør=0 then
                  operatør:= (tilst shift (-14) extract 8);
                if operatør=0 then
                  operatør:= radio_områdetabel(d.vt_op.data(4) extract 8);
                if operatør=0 or -,læsbit_ia(operatørmaske,operatør) then
                  tofrom(opkaldsflag,alle_operatører,op_maske_lgd)
                else sæt_bit_ia(opkaldsflag,operatør,1);
                ref:= første_frie_opkald; <* forudsættes <> 0 *>
                første_frie_opkald:=opkaldskø.ref(1) extract 12; <*hægt ud*>
                forrige:= (if type = 1 then sidste_opkald
                                       else sidste_nødopkald);
                opkaldskø.ref(1):= forrige shift 12;
                if type = 1 then
                begin
                  if første_opkald = 0 then første_opkald:= ref;
                  sidste_opkald:= ref;
                end
                else
                begin <*type = 2*>
                  if første_nødopkald = 0 then første_nødopkald:= ref;
                  sidste_nødopkald:= ref;
                end;
                if forrige <> 0 then
                  opkaldskø.forrige(1):= opkaldskø.forrige(1) shift (-12)
                                         shift 12 +ref;
    
                opkaldskø.ref(2):= tilst extract 22 add
                    (if type=2 then 1 shift 23 else 0);
                opkaldskø.ref(3):= ll;
                systime(5,0.0,r);
                ll:= round r//100;<*ttmm*>
                opkaldskø.ref(4):= ll shift 12 +type shift 8 +operatør extract 8;
                opkaldskø.ref(5):= sig shift 20 + omr;
                tofrom(opkaldskø.ref.opkald_meldt,ingen_operatører,op_maske_lgd);
                res:= 0;
                if type=2 then nød_opkald_brugt:=nødopkald_brugt + 1;
                opkaldskø_ledige:= opkaldskø_ledige -1;
                <*meddel opkald til berørte operatører *>
                signal_bin(bs_mobil_opkald);
                tæl_opkald(omr,type+1);
              end <* resultat = 3 *>
              else
              begin
    \f

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

    message procedure afvent_telegram side 1 - 880901/cl;
    
    integer procedure afvent_telegram(tlgr,lgd,ttyp,ptyp,pnum);
      integer array                   tlgr;
      integer                              lgd,ttyp,ptyp,pnum;
    begin
      integer i, pos, tegn, ac, sum, csum;
    
      pos:= 1;
      lgd:= 0;
      ttyp:= 'Z';
    <*V*> ac:= afvent_radioinput(z_fr_in,tlgr,false);
      if ac >= 0 then
      begin
        lgd:= 1;
        while læstegn(tlgr,lgd,tegn)<>0 do ;
        lgd:= lgd-2;
        if lgd >= 3 then
        begin
          i:= 1;
          ttyp:= læstegn(tlgr,i,tegn);
          ptyp:= læstegn(tlgr,i,tegn) - '@';
          pnum:= læstegn(tlgr,i,tegn) - '@';
        end
        else ac:= 6; <* for kort telegram - retransmitter *>
      end;
    
      afvent_telegram:= ac;
    end;
    \f

    message procedure b_answ side 1 - 880901/cl;
    
    procedure b_answ(answ,ht,spec,more,ac);
      value               ht,     more,ac;
      integer array  answ,   spec;
      boolean                     more;
      integer             ht,          ac;
    begin
      integer pos, i, sum, tegn;
    
      pos:= 1;
      skrivtegn(answ,pos,'B');
      skrivtegn(answ,pos,if more then 'B' else ' ');
      skrivtegn(answ,pos,ac+'@');
      skrivtegn(answ,pos,spec(1) shift (-18) extract 6+'@');
      skrivtegn(answ,pos,spec(1) shift (-12) extract 6+'@');
      skrivtegn(answ,pos,'@');
      skrivtegn(answ,pos,spec(1) shift (-8) extract 4+'@');
      skrivtegn(answ,pos,spec(1) extract 8+'@');
      for i:= 1 step 1 until spec(1) extract 8 do
        if spec(1+i)=0 then skrivtegn(answ,pos,'@')
        else
        begin
          skrivtegn(answ,pos,'D');
          anbringtal(answ,pos,spec(1+i),-4);
        end;
      for i:= 1 step 1 until 4 do
        skrivtegn(answ,pos,'@');
      skrivtegn(answ,pos,ht+'@');
      skrivtegn(answ,pos,'@');
    
      i:= 1; sum:= 0;
      while i < pos do
        sum:= (sum + læstegn(answ,i,tegn)) mod 256;
      skrivtegn(answ,pos,(sum shift (-4)) extract 4 + '@');
      skrivtegn(answ,pos,sum extract 4 + '@');
      repeat skrivtegn(answ,pos,0) until (pos mod 6)=1;
    end;
    \f

    message procedure ann_opkald side 1 - 881108/cl;
    
    integer procedure ann_opkald(vogn,omr);
      value                      vogn,omr;
      integer                    vogn,omr;
    begin
      integer array field vt_op,ref,næste,forrige;
      integer res, t, i, o;
    
      waitch(cs_vt_adgang,vt_op,true,-1);
      res:= -1;
      wait(bs_opkaldskø_adgang);
      ref:= første_nødopkald;
      if ref <> 0 then
        t:= 2
      else
      begin
        ref:= første_opkald;
        t:= if ref<>0 then 1 else 0;
      end;
    
      if t=0 then
        res:= 19 <* kø tom *>
      else
      begin
        while ref<>0 and res=(-1) do
        begin
          if vogn=opkaldskø.ref(2) extract 14 and
              omr=opkaldskø.ref(5) extract 8
          then
            res:= 0
          else
          begin
            ref:= opkaldskø.ref(1) extract 12;
            if ref=0 and t=2 then
            begin
              ref:= første_opkald;
              t:= if ref=0 then 0 else 1;
            end;
          end;
        end; <*while*>
    \f

    message procedure ann_opkald side 2 - 881108/cl;
    
        if ref<>0 then
        begin
          start_operation(vt_op,401,cs_radio_ind,17);
          d.vt_op.data(1):= vogn;
          d.vt_op.data(4):= omr;
          signalch(cs_vt,vt_op,gen_optype or vt_optype);
          waitch(cs_radio_ind,vt_op,vt_optype,-1);
    
          o:= opkaldskø.ref(4) extract 8;
          næste:= opkaldskø.ref(1);
          forrige:= næste shift (-12);
          næste:= næste extract 12;
          if forrige<>0 then
            opkaldskø.forrige(1):= opkaldskø.forrige(1) shift (-12) shift 12
                                   + næste
          else
          if t=2 then første_nødopkald:= næste
          else første_opkald:= næste;
    
          if næste<>0 then
            opkaldskø.næste(1):= opkaldskø.næste(1) extract 12
                                 + forrige shift 12
          else
          if t=2 then sidste_nødopkald:= forrige
          else sidste_opkald:= forrige;
    
          opkaldskø.ref(1):= første_frie_opkald;
          første_frie_opkald:= ref;
          opkaldskø_ledige:= opkaldskø_ledige + 1;
          if t=2 then nødopkald_brugt:= nødopkald_brugt - 1;
    
          if -, læsbit_ia(operatør_maske,o) or o=0 then
            tofrom(opkaldsflag,alle_operatører,op_maske_lgd)
          else
          begin
            sætbit_ia(opkaldsflag,o,1);
          end;
          signalbin(bs_mobilopkald);
        end;
      end;
    
      signalbin(bs_opkaldskø_adgang);
      signalch(cs_vt_adgang, vt_op, true);
      ann_opkald:= res;
    end;
    \f

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

    message procedure radio_ind side 2 - 810524/hko;
        trap(radio_ind_trap);
        laf:= 0;
        stack_claim((if cm_test then 200 else 150) +135+75);
    
    <*+2*>if testbit32 and overvåget or testbit28 then
            skriv_radio_ind(out,0);
    <*-2*>
          answ.laf(1):= long<:<'nl'>:>;
          io_opref:= op;
    
          repeat
            ac:= afvent_telegram(tlgr,lgd,ttyp,ptyp,pnum);
            pos:= 4;
            if ac = 0 then
            begin
    \f

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

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

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

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

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

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

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

    message procedure radio_ind side 10 - 881107/cl;
                end
                else
                if htyp='E' then
                begin <* radiokanal status *>
                  long onavn;
    
                  ac:= 0;
                  j:= 0;
                  for i:= 1 step 1 until max_antal_kanaler do
                  if kanal_id(i) = ptyp shift 5 + pnum then j:= i;
    
                  <* Alarmer for K12 = GLX ignoreres *>
                  <* 94.06.14/CL                     *>
                  <* Alarmer for K15 = HG  ignoreres *>
                  <* 95.07.31/CL                     *>
                  <* Alarmer for K10 = FS  ignoreres *>
                  <* 96.05.27/CL                     *>
                  if j>0 then
                  begin
                    onavn:= områdenavn(port_til_omr(ptyp shift 6 + pnum));
                    j:= (if (onavn = long<:GLX:>) or (onavn = long<:HG:>) or
                         (onavn = long<:FS:>) then 0 else j);
                  end;
    
                  læstegn(tlgr,9,tegn);
                  if j<>0 and (tegn='A' or tegn='E') then
                  begin
                    ref:= (j-1)*kanalbeskrlængde;
                    bs:= if tegn='E' then 0 else 15;
                    if bs<>sæt_hex_ciffer(kanal_tab.ref,3,bs) then
                    begin
                      tofrom(kanalflag,alle_operatører,op_maske_lgd);
                      signalbin(bs_mobil_opkald);
                    end;
                  end;
                  if tegn<>'A' and tegn<>'E' and j<>0 then
                  begin
                    waitch(cs_radio_pulje,opref,true,-1);
                    startoperation(opref,401,cs_radio_pulje,23);
                    i:= 1;
                    hægtstring(d.opref.data,i,<:radiofejl :>);
                    if læstegn(tlgr,4,k)<>'@' then
                    begin
                      if k-'@' = 17 then
                        hægtstring(d.opref.data,i,<: AMV:>)
                      else
                      if k-'@' = 18 then
                        hægtstring(d.opref.data,i,<: BHV:>)
                      else
                      begin
                        hægtstring(d.opref.data,i,<: BST:>);
                        anbringtal(d.opref.data,i,k-'@',1);
                      end;
                    end;
                    skrivtegn(d.opref.data,i,' ');
                    hægtstring(d.opref.data,i,string kanal_navn(j));
                    skrivtegn(d.opref.data,i,' ');
                    hægtstring(d.opref.data,i,
                      string område_navn(kanal_til_omr(j)));
                    if '@'<=tegn and tegn<='F' then
                      hægtstring(d.opref.data,i,case (tegn-'@'+1) of (
                        <*@*> <:: ukendt fejl:>,
                        <*A*> <:: compad-fejl:>,
                        <*B*> <:: ladefejl:>,
                        <*C*> <:: dør åben:>,
                        <*D*> <:: senderfejl:>,
                        <*E*> <:: compad ok:>,
                        <*F*> <:: liniefejl:>,
                        <::>))
                    else
                    begin
                      hægtstring(d.opref.data,i,<:: fejlkode :>);
                      skrivtegn(d.opref.data,i,tegn);
                    end;
                    repeat afsluttext(d.opref.data,i) until i mod 6 = 1;
                    signalch(cs_io,opref,gen_optype or rad_optype);
                    ref:= (j-1)*kanalbeskrlængde;
                    tofrom(kanal_tab.ref.kanal_alarm,alle_operatører,op_maske_lgd);
                    tofrom(kanalflag,alle_operatører,op_maske_lgd);
                    signalbin(bs_mobilopkald);
                  end;
    \f

    message procedure radio_ind side 11 - 881107/cl;
                end
                else
                if htyp='G' then
                begin <* fjerninkludering/-ekskludering af område *>
                  bs:= læstegn(tlgr,9,tegn)-'@';
                  j:= 0;
                  for i:= 1 step 1 until max_antal_kanaler do
                  if kanal_id(i) = ptyp shift 5 + pnum then j:= i;
                  if j<>0 then
                  begin
                    ref:= (j-1)*kanalbeskrlængde;
                    sætbiti(kanal_tab.ref.kanal_tilstand,11,bs extract 1);
                  end;
                  tofrom(kanalflag,alle_operatører,op_maske_lgd);
                  signalbin(bs_mobilopkald);
                  ac:= 0;
                end
                else
                if htyp='L' then
                begin <* vogntabelændringer *>
                  long field ll;
    
                  ll:= 10;
                  ac:= 0;
                  zno:= port_til_omr(ptyp shift 6 + pnum);
                  læstegn(tlgr,9,tegn);
                  if (tegn='N') or (tegn='O') then
                  begin
                    typ(1):= 1 shift 12 + (opkode-1); val(1):= 'H';
                    typ(2):= -1;
                    getch(cs_radio_ind,opref,rad_optype,typ,val);
                    if opref>0 then
                    begin
                      d.opref.resultat:= if tegn='N' then 3 else 60;
                      signalch(d.opref.retur,opref,d.opref.optype);
                    end;
                    ac:= -1;
                  end
                  else
                  if (tegn='G') and (tlgr.ll=(long<:FFFFF:> add 'F')) then
                    ac:= -1
                  else
                  if tegn='G' then <*indkodning*>
                  begin
                    pos:= 10; i:= 0;
                    while læstegn(tlgr,pos,tegn)>='0' and tegn<='9' and pos<=14 do
                      i:= i*10 + (tegn-'0');
                    i:= i mod 1000;
                    b_pn:= (1 shift 22) + (i shift 12);
                    if pos=14 and 'A'<=tegn and tegn<='Å' then
                      b_pn:= b_pn + ((tegn-'@') shift 7);
                    pos:= 14; i:= 0;
                    while læstegn(tlgr,pos,tegn)>='0' and tegn<='9' and pos<=16 do
                      i:= i*10 + (tegn-'0');
                    b_pn:= b_pn + i;
                    pos:= 16; i:= 0;
                    while læstegn(tlgr,pos,tegn)>='0' and tegn<='9' and pos<=20 do
                      i:= i*10 + (tegn-'0');
                    b_pt:= i;
                    bs:= 11;
    \f

    message procedure radio_ind side 12 - 881107/cl;
                  end
                  else
                  if tegn='H' then <*udkodning*>
                  begin
                    pos:= 10; i:= 0;
                    while læstegn(tlgr,pos,tegn)>='0' and tegn<='9' and pos<=14 do
                      i:= i*10 + (tegn-'0');
                    b_pt:= i;
                    b_pn:= 0;
                    bs:= 12;
                  end
                  else
                  if tegn='I' then <*slet tabel*>
                  begin
                    b_pt:= 1; b_pn:= 999; bs:= 19;
                    pos:= 10; i:= 0;
                    i:= hex_to_dec(læstegn(tlgr,pos,tegn))*16 +
                        hex_to_dec(læstegn(tlgr,pos,tegn));
                    zno:= i;
                  end
                  else ac:= 2;
                  if ac<0 then
                    ac:= 0
                  else
    
                  if ac=0 then
                  begin
                    waitch(cs_vt_adgang,opref,true,-1);
                    startoperation(opref,401,cs_vt_adgang,bs);
                    d.opref.data(1):= b_pt;
                    d.opref.data(2):= b_pn;
                    d.opref.data(if bs=19 then 3 else 4):= zno;
                    signalch(cs_vt,opref,gen_optype or vt_optype);
                  end;
                end
                else
                  ac:= 2;
    
                pos:= 1;
                skrivtegn(answ,pos,'H');
                skrivtegn(answ,pos,' ');
                skrivtegn(answ,pos,ac+'@');
                i:= 1; sum:= 0;
                while i < pos do
                  sum:= (sum + læstegn(answ,i,tegn)) mod 256;
                skriv_tegn(answ,pos, sum shift (-4) extract 4 +'@');
                skriv_tegn(answ,pos, sum extract 4 +'@');
                repeat afsluttext(answ,pos) until pos mod 6 = 1;
    <*+2*>      if (testbit36 or testbit38) and overvåget then
                disable begin
                  write(zrl,<<zd dd dd.dd >,now,<:fr-answ: :>,answ.laf);
                  outchar(zrl,'nl');
                end;
    <*-2*>
                write(z_fr_out,"nl",1,answ.laf,"cr",1);
                disable setposition(z_fr_out,0,0);
                ac:= -1;
    \f

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

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

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

    message procedure radio_ud side 1 - 820301/hko;
    
      procedure radio_ud(op);
          value          op;
          integer        op;
        begin
          integer array field opref,io_opref;
          integer opgave, kode, pos, tegn, i, sum, rc, svar_status;
          integer array answ, tlgr(1:32);
          long array field laf;
    
          procedure skriv_radio_ud(z,omfang);
            value                    omfang;
            zone                   z;
            integer                  omfang;
            begin integer i1;
              disable i1:= write(z,"nl",1,<:+++ radio-ud  ::>);
              if omfang > 0 then
              disable begin real x; long array field tx;
                tx:= 0;
                trap(slut);
                write(z,"nl",1,
                    <:  opref:        :>,opref,"nl",1,
                    <:  io-opref:     :>,io_opref,"nl",1,
                    <:  opgave:       :>,opgave,"nl",1,
                    <:  kode:         :>,kode,"nl",1,
                    <:  pos:          :>,pos,"nl",1,
                    <:  tegn:         :>,tegn,"nl",1,
                    <:  i:            :>,i,"nl",1,
                    <:  sum:          :>,sum,"nl",1,
                    <:  rc:           :>,rc,"nl",1,
                    <:  svar-status:  :>,svar_status,"nl",1,
                    <:  tlgr:         ":>,tlgr.tx,<:":>,"nl",1,
                    <:  answ:         ":>,answ.tx,<:":>,"nl",1,
                    <::>);
               skriv_coru(z,coru_no(402));
    slut:
             end; <*disable*>
           end skriv_radio_ud;
    
          trap(radio_ud_trap);
          laf:= 0;
          stack_claim((if cm_test then 200 else 150) +35+100);
    
    <*+2*>if testbit32 and overvåget  or testbit28 then
            skriv_radio_ud(out,0);
    <*-2*>
    
          io_opref:= op;
    \f

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

    message procedure radio_ud side 3 - 881107/cl;
    
            if d.opref.resultat=0 then
            begin
              if (opgave <= 'B')
                 <* or (opgave='H' and d.opref.data(2)='L') *> then
              begin
                systime(1,0,d.opref.tid);
                signalch(cs_radio_ind,opref,d.opref.optype);
                opref:= 0;
              end;
              <* beregn checksum og send *>
              i:= 1; sum:= 0;
              while i < pos do
                sum:= (sum + læstegn(tlgr,i,tegn)) mod 256;
              skrivtegn(tlgr,pos,sum shift (-4) + '@');
              skrivtegn(tlgr,pos,sum extract 4  + '@');
              repeat skrivtegn(tlgr,pos,0) until pos mod 6 = 1;
    <**********************************************>
    <* specialaktion p.g.a. modtagebesvær i COMET *>
    
              if opgave='B' then delay(1);
     
    <*                                94.04.19/cl *>
    <**********************************************>
     
    <*+2*>    if (testbit36 or testbit39) and overvåget then
              disable begin
                write(zrl,<<zd dd dd.dd >,now,<:rf-tlgr: :>,tlgr.laf);
                outchar(zrl,'nl');
              end;
    <*-2*>
              setposition(z_rf_in,0,0);
              write(z_rf_out,"nl",1,tlgr.laf,"cr",1);
              disable setposition(z_rf_out,0,0);
              rc:= 0;
    
              <* afvent svar*>
              repeat
    <*V*>       svar_status:= afvent_radioinput(z_rf_in,answ,true);
                if svar_status=6 then
                begin
                  svar_status:= -3;
                  goto radio_ud_check;
                end;
                pos:= 1;
                while læstegn(answ,pos,i)<>0 do ;
                pos:= pos-2;
                if pos > 0 then
                begin
                  if pos<3 then
                    svar_status:= -2 <*format error*>
                  else
                  begin
                    if læstegn(answ,3,tegn)<>'@' then
                      svar_status:= tegn - '@'
                    else
                    begin
                      pos:= 1;
                      læstegn(answ,pos,tegn);
                      if tegn<>opgave then
                        svar_status:= -4 <*gal type*>
                      else
                      if læstegn(answ,pos,tegn)<>' ' then
                        svar_status:= -tegn <*fejl*>
                      else
                        svar_status:= læstegn(answ,pos,tegn)-'@';
                    end;
                  end;
                end
                else
                  svar_status:= -1;
    \f

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

    message procedure radio_medd_opkald side 1 - 810610/hko;
    
      procedure radio_medd_opkald;
        begin
          integer array field ref,op_ref;
          integer i;
    
          procedure skriv_radio_medd_opkald(z,omfang);
            value                             omfang;
            zone                            z;
            integer                           omfang;
            begin integer x;
              disable x:= write(z,"nl",1,<:+++ radio-medd-opkald:>);
              write(z,"sp",26-x);
              if omfang > 0 then
              disable begin
                trap(slut);
                write(z,"nl",1,
                  <:  ref:    :>,ref,"nl",1,
                  <:  opref:  :>,op_ref,"nl",1,
                  <:  i:      :>,i,"nl",1,
                  <::>);
                skriv_coru(z,abs curr_coruno);
    slut:
              end;<*disable*>
            end skriv_radio_medd_opkald;
    
          trap(radio_medd_opkald_trap);
    
          stack_claim((if cm_test then 200 else 150) +1);
    
    <*+2*>if testbit32 and overvåget or testbit28 then
            disable skriv_radio_medd_opkald(out,0);
    <*-2*>
    \f

    message procedure radio_medd_opkald side 2 - 820301/hko;
    
          repeat
    
    <*V*>   wait(bs_mobil_opkald);
    <*V*>   wait_ch(cs_radio_medd,op_ref,genoptype or rad_optype,-1);
    <*V*>   wait(bs_opkaldskø_adgang);
    
            ref:= første_nød_opkald;
            while ref <> 0 do <* meld ikke meldt nødopkald til io *>
            begin
              i:= opkaldskø.ref(2);
              if i < 0 then
              begin
                <* nødopkald ikke meldt *>
    
                start_operation(op_ref,403,cs_radio_medd,45<*nødop.modt.*>);
                d.op_ref.data(1):= <* vogn_id *>
                  if opkaldskø.ref(3)<>0 then opkaldskø.ref(3) else i extract 22;
                opkaldskø.ref(2):= i extract 22;
                d.op_ref.data(2):= opkaldskø.ref(4) shift(-12); <* ttmm *>
                d.op_ref.data(3):= opkaldskø.ref(5) extract 20;
                i:= op_ref;
    <*+2*>      if testbit35 and overvåget then
                disable begin
                  write(out,"nl",1,<:radio nød-medd:>);
                  skriv_op(out,op_ref);
                  ud;
                end;
    <*-2*>
                signal_ch(cs_io,op_ref,gen_optype or rad_optype);
    <*V*>       wait_ch(cs_radio_medd,op_ref,rad_optype,-1);
    <*+4*>      if i <> op_ref then
                  fejlreaktion(11<*fremmed post*>,i,<:radio io/medd:>,0);
    <*-4*>
              end;<*nødopkald ikke meldt*>
    
              ref:= opkaldskø.ref(1) extract 12;
            end; <* melding til io *>
    \f

    message procedure radio_medd_opkald side 3 - 820304/hko;
    
            start_operation(op_ref,403,cs_radio_medd,
                            40<*opdater opkaldskøbill*>);
            signal_bin(bs_opkaldskø_adgang);
    <*+2*>  if testbit35 and overvåget then
            disable begin
              write(out,"nl",1,<:radio opdater opkaldskø-billede:>);
              skriv_op(out,op_ref);
              write(out,       <:opkaldsflag: :>,"nl",1);
              outintbits_ia(out,opkaldsflag,1,op_maske_lgd//2);
              write(out,"nl",1,<:kanalflag:   :>,"nl",1);
              outintbits_ia(out,kanalflag,1,op_maske_lgd//2);
              write(out,"nl",1,<:samtaleflag: :>,"nl",1);
              outintbits_ia(out,samtaleflag,1,op_maske_lgd//2);
              ud;
            end;
    <*-2*>
            signal_ch(cs_op,op_ref,gen_optype or rad_optype);
    
          until false;
    
    radio_medd_opkald_trap:
    
          disable skriv_radio_medd_opkald(zbillede,1);
    
        end radio_medd_opkald;
    \f

    message procedure radio_adm side 1 - 820301/hko;
    
      procedure radio_adm(op);
      value               op;
      integer             op;
        begin
          integer array field opref, rad_op, iaf;
          integer nr,i,j,k,res,opgave,tilst,operatør;
    
          procedure skriv_radio_adm(z,omfang);
            value                 omfang;
            zone                z;
            integer               omfang;
            begin integer i1;
              disable i1:= write(z,"nl",1,<:+++ radio-adm:>);
              write(z,"sp",26-i1);
              if omfang > 0 then
              disable begin real x;
                trap(slut);
    \f

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

    message procedure radio_adm side 3 - 820304/hko;
    
          rad_op:= op;
    
          trap(radio_adm_trap);
          stack_claim((if cm_test then 200 else 150) +50);
    
    <*+2*>if testbit32 and overvåget or testbit28 then
            skriv_radio_adm(out,0);
    <*-2*>
    
          pass;
          if -,testbit22 then
          begin
            startoperation(rad_op,404,cs_radio_adm,'I' shift 12 + 60);
            signalch(cs_radio_ud,rad_op,rad_optype);
            waitch(cs_radio_adm,rad_op,rad_optype,-1);
          end;
          repeat
            waitch(cs_radio_adm,opref,true,-1);
    <*+2*>
            if testbit33 and overvåget then
            disable begin
              skriv_radio_adm(out,0);
              write(out,<: operation modtaget på cs:>,<<d>,cs_radio_adm);
              skriv_op(out,opref);
            end;
    <*-2*>
    
            k:= d.op_ref.opkode extract 12;
            opgave:= d.opref.opkode shift (-12);
            nr:=operatør:=d.op_ref.data(1);
    
    <*+4*>  if (d.op_ref.optype and
                  (gen_optype or io_optype or op_optype or vt_optype))
              extract 12 = 0 then fejlreaktion(12<*operationstype*>,op_ref,
                                    <:radio_adm:>,0);
    <*-4*>
            if k = 74 <* RA,I *> then
            begin
              startoperation(rad_op,404,cs_radio_adm,'I' shift 12 + 60);
              signalch(cs_radio_ud,rad_op,rad_optype);
              waitch(cs_radio_adm,rad_op,rad_optype,-1);
              d.opref.resultat:= if d.rad_op.resultat=0 then 3
                                 else d.rad_op.resultat;
              signalch(d.opref.retur,opref,d.opref.optype);
    \f

    message procedure radio_adm side 4 - 820301/hko;
            end
            else
    
            if k = 1<*IN,O*> or k = 2<*EK,O*> or k = 77<*FO,O*> or
               k = 5<*FO,L*> or k = 6<*ST  *>                   then
            begin
              if k = 5 or k=77 then
              begin
    
    <*V*>       wait(bs_opkaldskø_adgang);
                if k=5 then
                begin
                  disable for iaf:= 0 step 512 until (max_linienr//768*512) do
                  begin
                    i:= læs_fil(1035,iaf//512+1,nr);
                    if i <> 0 then
                      fejlreaktion(5<*læs_fil*>,i,<:liniefordelingstabel:>,0);
                    tofrom(radio_linietabel.iaf,fil(nr),
                      if (((max_linienr+1 - (iaf//2*3))+2)//3*2) > 512 then 512
                      else ((max_linienr+1 - (iaf//2*3))+2)//3*2);
                  end;
    
                  for i:= 1 step 1 until max_antal_mobilopkald do
                  begin
                    iaf:= i*opkaldskø_postlængde;
                    nr:= opkaldskø.iaf(3) shift (-12) extract 10; <*linienr*>
                    if nr>0 then
                    begin
                      læs_tegn(radio_linietabel,nr+1,operatør);
                      if operatør>max_antal_operatører then operatør:= 0;
                      opkaldskø.iaf(4):= opkaldskø.iaf(4) shift(-8) shift 8 +
                                         operatør;
                    end;
                  end;
                end
                else
                if k=77 then
                begin
                  disable i:= læsfil(1034,1,nr);
                  if i<>0 then fejlreaktion(5,i,<:områdefordelingstabel:>,0);
                  tofrom(radio_områdetabel,fil(nr),max_antal_områder*2);
                  for i:= 1 step 1 until max_antal_mobilopkald do
                  begin
                    iaf:= i*opkaldskø_postlængde;
                    nr:= opkaldskø.iaf(5) extract 4;
                    operatør:= radio_områdetabel(nr);
                    if operatør < 0 or max_antal_operatører < operatør then
                      operatør:= 0;
                    if opkaldskø.iaf(4) extract 8=0 and
                       opkaldskø.iaf(3) shift (-12) extract 10 = 0 then
                          opkaldskø.iaf(4):= opkaldskø.iaf(4) shift(-8) shift 8 +
                                             operatør;
                  end;
                end;
    
                tofrom(opkaldsflag,alle_operatører,op_maske_lgd);
                signal_bin(bs_opkaldskø_adgang);
    
                signal_bin(bs_mobil_opkald);
    
                d.op_ref.resultat:= res:= 3;
    \f

    message procedure radio_adm side 5 - 820304/hko;
    
              end <*k = 5 / k = 77*>
              else
              begin <*k =1,2 eller 6 (IN,O - EK,O eller ST) *>
                res:= 3;
                for nr:= 1 step 1 until max_antal_kanaler do
                begin
                  iaf:= (nr-1)*kanal_beskr_længde;
                  if kanal_tab.iaf.kanal_tilstand shift (-16) = 
                                                  op_talevej(operatør) then
                  begin
                    tilst:= kanal_tab.iaf.kanal_tilstand extract 2;
                    if tilst <> 0 then
                      res:= 16; <*skærm optaget*>
                  end; <* kanal_tab(operatør) = operatør*>
                end;
                tofrom(opkaldsflag,alle_operatører,op_maske_lgd);
                sæt_bit_ia(opkaldsflag,operatør,k extract 1);
                signal_bin(bs_mobil_opkald);
                d.op_ref.resultat:= res;
              end;<*k=1,2 eller 6 *>
    
    <*+2*>    if testbit35 and overvåget then
              disable begin
                skriv_radio_adm(out,0);
                write(out,<: sender til :>,
                  if k=5 or k=6 or k=77 or res > 3 then d.op_ref.retur
                    else cs_op);
                skriv_op(out,op_ref);
              end;
    <*-2*>
    
              if k=5 or k=6 or k=77 or res > 3 then
                signal_ch(d.op_ref.retur,op_ref,d.op_ref.optype)
              else
              begin <*k = (1 eller 2) og res = 3 *>
                d.op_ref.resultat:=0;
                signal_ch(cs_op,op_ref,d.op_ref.optype);
              end;
    \f

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

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

    message vogntabel erklæringer side 1 - 820301/cl;
    
    integer cs_vt, cs_vt_adgang,cs_vt_logpool,cs_vt_opd,cs_vt_rap,
            cs_vt_tilst,cs_vt_auto,cs_vt_grp,cs_vt_spring,vt_op,
            cs_vt_log;
    integer sidste_bus,sidste_linie_løb,tf_vogntabel,
            max_antal_i_gruppe,tf_gruppedef,tf_gruppeidenter,tf_springdef,
            vt_log_slicelgd;
    integer array bustabel,bustabel1(0:max_antal_busser),
                  linie_løb_tabel(0:max_antal_linie_løb),
                  springtabel(1:max_antal_spring,1:3),
                  gruppetabel(1:max_antal_grupper),
                  gruppeopkald(1:max_antal_gruppeopkald,1:2), <* ident , filref *>
                  vt_logop(1:2),
                  vt_logdisc(1:4),
                  vt_log_tail(1:10);
    boolean array busindeks(-1:max_antal_linie_løb),
                  bustilstand(-1:max_antal_busser),
                  linie_løb_indeks(-1:max_antal_busser);
    real array springtid,springstart(1:max_antal_spring);
    real          vt_logstart;
    integer field v_kode,v_bus,v_ll1,v_ll2;
    integer array field v_tekst;
    real field v_tid;
    
    zone zvtlog(128,1,stderror);
    
    \f

    message vogntabel erklæringer side 2 - 851001/cl;
    
    procedure skriv_vt_variable(zud);
      zone                      zud;
    begin integer i; long array field laf;
      laf:= 0;
      write(zud,"nl",1,<:+++++ vogntabel variable::>,"nl",1,<<d>,
        <:vt-op-længde       :>,vt_op_længde,"nl",1,
        <:cs-vt              :>,cs_vt,"nl",1,
        <:cs-vt-adgang       :>,cs_vt_adgang,"nl",1,
        <:cs-vt-logpool      :>,cs_vt_logpool,"nl",1,
        <:cs-vt-opd          :>,cs_vt_opd,"nl",1,
        <:cs-vt-rap          :>,cs_vt_rap,"nl",1,
        <:cs-vt-tilst        :>,cs_vt_tilst,"nl",1,
        <:cs-vt-auto         :>,cs_vt_auto,"nl",1,
        <:cs-vt-grp          :>,cs_vt_grp,"nl",1,
        <:cs-vt-spring       :>,cs_vt_spring,"nl",1,
        <:cs-vt-log          :>,cs_vt_log,"nl",1,
        <:vt-op              :>,vt_op,"nl",1,
        <:vt-logop(1)        :>,vt_logop(1),"nl",1,
        <:vt-logop(2)        :>,vt_logop(2),"nl",1,
        <:sidste-bus         :>,sidste_bus,"nl",1,
        <:sidste-linie-løb   :>,sidste_linie_løb,"nl",1,
        <:max-antal-i-gruppe :>,max_antal_i_gruppe,"nl",1,
        <:tf-vogntabel       :>,tf_vogntabel,"nl",1,
        <:tf-gruppedef       :>,tf_gruppedef,"nl",1,
        <:tf-gruppeidenter   :>,tf_gruppeidenter,"nl",1,
        <:tf-springdef       :>,tf_springdef,"nl",1,
        <:vt-logskift        :>,vt_logskift,"nl",1,
        <:vt-logdisc         :>,vt_logdisc.laf,"nl",1,
        <:vt-log-slicelgd    :>,vt_log_slicelgd,"nl",1,
        <:vt-log-aktiv       :>,
           if vt_log_aktiv then <:true:> else <:false:>,"nl",1,
        <:vt-logstart        :>,<<zdddddd.dd>,vt_logstart,"nl",1,
        <::>);
      write(zud,"nl",1,<:vt-logtail:<'nl'>:>);
      laf:= 2;
      write(zud,"sp",2,<<d>,vt_logtail(1),"sp",1,vt_logtail.laf);
      for i:= 6 step 1 until 10 do
        write(zud,"sp",1,<<d>,vt_logtail(i));
      write(zud,"nl",1);
    end;
    \f

    message procedure p_vogntabel side 1 - 820301/cl;
    
    procedure p_vogntabel(z);
      zone z;
    begin
      integer i,b,s,o,t,li,lb,lø,g;
      write(z,<:<10>***** udskrift af vogntabel *****<10>:>,
        <:<10>max-antal-busser =:>,max_antal_busser,<:  sidste-bus =:>,
        sidste_bus,<:<10>max-antal-linie-løb =:>,max_antal_linie_løb,
        <:  sidste-linie-løb =:>,sidste_linie_løb,"nl",1);
    
      for i:= 1 step 1 until sidste_bus do
      begin
        b:= bustabel(i) extract 14;
        g:= bustabel(i) shift (-14);
        s:= bustabel1(i) shift (-23);
        o:= bustabel1(i) extract 8;
        t:= intg(bustilstand(i));
        li:= linie_løb_tabel(linie_løb_indeks(i) extract 12);
        lø:= li extract 7;
        lb:= li shift (-7) extract 5;
        lb:= if lb=0 then 32 else lb+64;
        li:= li shift (-12) extract 10;
        write(z,if i mod 2 = 1 then <:<10>:> else <:      :>,
          <<zddd>,b,if s=1 then <:B:> else <: :>,"sp",1,
          if g > 0 then string bpl_navn(g) else <:   :>,
          ";",1,true,4,string område_navn(o),
          <:(:>,<<-dd>,t,<:)  :>," ",if lb=' ' then 1 else 0,<<ddd>,
          li,false add lb,if lb=' ' then 0 else 1,<:/:>,<<zd>,lø);
      end;
    end p_vogntabel;
    \f

    message procedure p_gruppetabel side 1 - 810531/cl;
    
    procedure p_gruppetabel(z);
      zone                  z;
    begin
      integer i,nr,bogst;
      boolean spc_gr;
      write(z,"nl",2,<:*****  udskrift af gruppetabel  *****:>,"nl",1,
        <:max-antal-grupper =:>,max_antal_grupper,
        <:   max-antal-i-gruppe =:>,max_antal_i_gruppe,
        <:   max-antal-gruppeopkald =:>,max_antal_gruppeopkald,"nl",2,
        <:gruppetabel::>);
      for i:= 1 step 1 until max_antal_grupper do
        write(z,if i mod 10 = 1 then <:<10>:> else <:  :>,<<dd>,i,":",1,
          if gruppetabel(i) <> 0 then "G" else " ",1,true,2,<<b>,
          gruppetabel(i) extract 7);
      write(z,"nl",2,<:gruppeopkald::>);
      for i:= 1 step 1 until max_antal_gruppeopkald do
      begin
        write(z,if i mod 4 = 1 then <:<10>:> else <:   :>,<<dd>,i,":",1);
        if gruppeopkald(i,1) = 0 then
          write(z,"sp",11)
        else
        begin
          spc_gr:= gruppeopkald(i,1) shift (-21) = 5;
          if spc_gr then nr:= gruppeopkald(i,1) extract 7
          else
          begin
            nr:= gruppeopkald(i,1) shift (-5) extract 10;
            bogst:= gruppeopkald(i,1) extract 5 +'@';
            if bogst = '@' then bogst:= 'sp';
          end;
          if spc_gr then
            write(z,<:(G:>,<<d>,true,3,nr)
          else
            write(z,"(",1,<<ddd>,nr,false add bogst,1);
          write(z,",",1,<<dddd>,gruppeopkald(i,2),")",1);
        end;
      end;
    end p_gruppetabel;
    \f

    message procedure p_springtabel side 1 - 810519/cl;
    
    procedure p_springtabel(z);
      zone                  z;
    begin
      integer li,bo,max,st,nr;
      long indeks;
      real t;
    
      write(z,"nl",2,<:***** springtabel *****:>,"nl",1,
        <:max-antal-spring =:>,max_antal_spring,"nl",2,
        <:nr spring-id max status   næste-tid:>,"nl",1);
      for nr:= 1 step 1 until max_antal_spring do
      begin
        write(z,<<dd>,nr);
        <* if springtabel(nr,1)<>0 then *>
        begin
          li:= springtabel(nr,1) shift (-5) extract 10;
          bo:= springtabel(nr,1) extract 5;
          if bo<>0 then bo:= bo + 'A' - 1;
          indeks:= extend springtabel(nr,2) shift 24;
          st:= extend springtabel(nr,3) shift (-12) extract 24;
          max:= springtabel(nr,3) extract 12;
          write(z,"sp",(bo=0) extract 1 + 2,<<ddd>,li,false add bo,1,<:.:>);
          write(z,"sp",4-write(z,string indeks),<< dd>,max,<<    -dd>,st);
          if springtid(nr)<>0.0 then
            write(z,<< zddddd.dddd>,systime(4,springtid(nr),t)+t/1000000)
          else
            write(z,<<      d.d   >,0.0);
          if springstart(nr)<>0.0 then
            write(z,<< zddddd.dddd>,systime(4,springstart(nr),t)+t/1000000)
          else
            write(z,<<      d.d   >,0.0);
        end
    <*  else
          write(z,<:  --------:>)*>;
        write(z,"nl",1);
      end;
    end p_springtabel;
    \f

    message procedure find_busnr side 1 - 820301/cl;
    
    integer procedure findbusnr(ll_id,busnr,garage,tilst);
      value   ll_id;
      integer ll_id, busnr, garage, tilst;
    begin
      integer i,j;
    
      j:= binærsøg(sidste_linie_løb,
            (linie_løb_tabel(i) - ll_id), i);
      if j<>0 then <* linie/løb findes ikke *>
      begin
        find_busnr:= -1;
        busnr:= 0;
        garage:= 0;
        tilst:= 0;
      end
      else
      begin
        busnr:= bustabel(busindeks(i) extract 12);
        tilst:= intg(bustilstand(intg(busindeks(i))));
        garage:= busnr shift (-14);
        busnr:= busnr extract 14;
        find_busnr:= busindeks(i) extract 12;
      end;
    end find_busnr;
    \f

    message procedure søg_omr_bus side 1 - 881027/cl;
    
    
    integer procedure søg_omr_bus(bus,ll,gar,omr,sig,tilst);
      value bus;
      integer bus,ll,gar,omr,sig,tilst;
    begin
      integer i,j,nr,bu,bi,bl;
    
      j:= binærsøg(sidste_bus,((bustabel(bi) extract 14) - (bus extract 14)),bi);
      nr:= -1;
      if j=0 then
      begin
        bl:= bu:= bi;
        while bl>1 and bustabel(bl-1) extract 14 = bus extract 14 do bl:=bl-1;
        while bu<sidste_bus and
          bustabel(bu+1) extract 14 = bus extract 14 do bu:= bu+1;
    
        if bl<>bu then
        begin
          <* flere busser med samme tekniske nr. omr skal passe *>
          nr:= -2;
          for bi:= bl step 1 until bu do
            if bustabel1(bi) extract 8 = omr extract 8 then nr:= bi;
        end
        else
          nr:= bi;
      end;
    
      if nr<0 then
      begin
        <* bus findes ikke *>
        ll:= gar:= tilst:= sig:= 0;
      end
      else
      begin
        tilst:= intg(bustilstand(nr));
        gar:= bustabel(nr) shift (-14);
        ll:= linie_løb_tabel( linie_løb_indeks(nr) extract 12 );
        if omr=0 then omr:= bustabel1(nr) extract 8;
        sig:= bustabel1(nr) shift (-23);
      end;
      søg_omr_bus:= nr;
    end;
    \f

    message procedure find_linie_løb side 1 - 820301/cl;
    
    integer procedure find_linie_løb(busnr,linie_løb,garage,tilst);
      value   busnr;
      integer busnr, linie_løb, garage, tilst;
    begin
      integer i,j;
    
      j:= binærsøg(sidste_bus,((bustabel(i) extract 14) - (busnr extract 14)), i);
    
      if j<>0 then <* bus findes ikke *>
      begin
        find_linie_løb:= -1;
        linie_løb:= 0;
        garage:= 0;
        tilst:= 0;
      end
      else
      begin
        tilst:= intg(bustilstand(i));
        garage:= bustabel(i) shift (-14);
        linie_løb:= linie_løb_tabel(linie_løb_indeks(i) extract 12);
        find_linie_løb:= linie_løb_indeks(i) extract 12;
      end;
    end find_linie_løb;
    \f

    message procedure h_vogntabel side 1 - 810413/cl;
    
    <* hovedmodulcorutine for vogntabelmodul *>
    
    procedure h_vogntabel;
    begin
      integer array field op;
      integer dest_sem,k;
    
      procedure skriv_h_vogntabel(zud,omfang);
        value                         omfang;
        zone                      zud;
        integer                       omfang;
      begin
        write(zud,"nl",1,<:+++ hovedmodul vogntabel :>);
        if omfang<>0 then
        disable
        begin
          skriv_coru(zud,abs curr_coruno);
          write(zud,"nl",1,<<d>,
            <:cs-vt     :>,cs_vt,"nl",1,
            <:op        :>,op,"nl",1,
            <:dest-sem  :>,dest_sem,"nl",1,
            <:k         :>,k,"nl",1,
            <::>);
        end;
      end;
    \f

    message procedure h_vogntabel side 2 - 820301/cl;
    
      stackclaim(if cm_test then 198 else 146);
      trap(h_vt_trap);
    
    <*+2*>
    <**> disable if testbit47 and overvåget or testbit28 then
    <**>   skriv_h_vogntabel(out,0);
    <*-2*>
    
      repeat
        waitch(cs_vt,op,true,-1);
    <*+4*>
      if (d.op.optype and gen_optype) extract 12 = 0 and
         (d.op.optype and vt_optype) extract 12 = 0 then
       fejlreaktion(12,op,<:vogntabel:>,0);
    <*-4*>
      disable
      begin
    
        k:= d.op.opkode extract 12;
        dest_sem:=
          if k =   9 then cs_vt_rap else
          if k =  10 then cs_vt_rap else
          if k =  11 then cs_vt_opd else
          if k =  12 then cs_vt_opd else
          if k =  13 then cs_vt_opd else
          if k =  14 then cs_vt_tilst else
          if k =  15 then cs_vt_tilst else
          if k =  16 then cs_vt_tilst else
          if k =  17 then cs_vt_tilst else
          if k =  18 then cs_vt_tilst else
          if k =  19 then cs_vt_opd else
          if k =  20 then cs_vt_opd else
          if k =  21 then cs_vt_auto else
          if k =  24 then cs_vt_opd else
          if k =  25 then cs_vt_grp else
          if k =  26 then cs_vt_grp else
          if k =  27 then cs_vt_grp else
          if k =  28 then cs_vt_grp else
          if k =  30 then cs_vt_spring else
          if k =  31 then cs_vt_spring else
          if k =  32 then cs_vt_spring else
          if k =  33 then cs_vt_spring else
          if k =  34 then cs_vt_spring else
          if k =  35 then cs_vt_spring else
          -1;
    \f

    message procedure h_vogntabel side 3 - 810422/cl;
    
    <*+2*>
    <**> if testbit41 and overvåget then
    <**> begin
    <**>   skriv_h_vogntabel(out,0); write(out,<:   modtaget operation:>);
    <**>   skriv_op(out,op);
    <**> end;
    <*-2*>
      end;
    
      if dest_sem = -1 then
        fejlreaktion(2,k,<:vogntabel:>,0);
      disable signalch(dest_sem,op,d.op.optype);
    until false;
    h_vt_trap:
      disable skriv_h_vogntabel(zbillede,1);
    end h_vogntabel;
    \f

    message procedure vt_opdater side 1 - 810317/cl;
    
    procedure vt_opdater(op1);
      value              op1;
      integer            op1;
    begin
      integer array field op,radop;
      integer funk,res,busnr,ll_id,ll1,omr,gar,sig,tilst,bi,li,s,zi,
        format,ll_id1,ll_id2,inf1,inf2,i,bi1,bi2,li1,li2,pm1,
        flin,slin,finx,sinx;
      integer field bn,ll;
    
    procedure skriv_vt_opd(zud,omfang);
      value omfang; integer omfang;
      zone zud;
    begin
      write(zud,"nl",1,<:+++ vt_opdater           :>);
      if omfang <> 0 then
      disable
      begin
        skriv_coru(zud,abs curr_coruno);
        write(zud,"nl",1,
          <:  op:   :>,op,"nl",1,
          <:  radop::>,radop,"nl",1,
          <:  funk: :>,funk,"nl",1,
          <:  res:  :>,res,"nl",1,
          <::>);
      end;
    end skriv_vt_opd;
    
      integer procedure opd_omr(fnk,omr,bus,ll);
        value                   fnk,omr,bus,ll;
        integer                 fnk,omr,bus,ll;
      begin
        opd_omr:= 3;
        <*GØR PROCEDUREN TIL DUMMYPROCEDURE - 
          ændringer skal ikke længere meldes til yderområder *>
        goto dummy_retur;
    
        if omr extract 8 > 3 then
        begin
          startoperation(radop,501,cs_vt_opd,fnk);
          d.radop.data(1):= omr;
          d.radop.data(2):= bus;
          d.radop.data(3):= ll;
          signalch(cs_rad,radop,vt_optype);
    <*V*> waitch(cs_vt_opd,radop,vt_optype,-1);
          opd_omr:= d.radop.resultat;
        end
        else
          opd_omr:= 0;
    dummy_retur:
      end;
    message procedure vt_opdater side 1a - 920517/cl;
    
      procedure opd_log(kilde,kode,bus,ll1,ll2);
        value           kilde,kode,bus,ll1,ll2;
        integer         kilde,kode,bus,ll1,ll2;
      begin
        integer array field op;
    
    <*V*> waitch(cs_vt_logpool,op,vt_optype,-1);
    
        startoperation(op,curr_coruid,cs_vt_logpool,0);
        systime(1,0.0,d.op.data.v_tid);
        d.op.data.v_kode:= kode + (if kilde=506 <*vt_auto*> then 0 else 4);
        d.op.data.v_bus:= bus;
        d.op.data.v_ll1:= ll1;
        d.op.data.v_ll2:= ll2;
        signalch(cs_vt_log,op,vt_optype);
      end;
    
      stackclaim((if cm_test then 198 else 146)+125);
    
      bn:= 4; ll:= 2;
      radop:= op1;
      trap(vt_opd_trap);
    
    <*+2*>
    <**> disable if testbit47 and overvåget or testbit28 then
    <**>   skriv_vt_opd(out,0);
    <*-2*>
    \f

    message procedure vt_opdater side 2 - 851001/cl;
    
    vent_op:
      waitch(cs_vt_opd,op,gen_optype or vt_optype,-1);
    
    <*+2*>
    <**>  disable
    <**>  if testbit41 and overvåget then
    <**>  begin
    <**>    skriv_vt_opd(out,0);
    <**>    write(out,<:   modtaget operation:>);
    <**>    skriv_op(out,op);
    <**>  end;
    <*-2*>
    
    <*+4*>
    <**>if op<>vt_op then
    <**>begin
    <**>  disable begin
    <**>    fejlreaktion(11,op,<:vt-opdater:>,1);
    <**>    d.op.resultat:= 31; <*systemfejl*>
    <**>    signalch(d.op.retur,op,d.op.optype);
    <**>  end;
    <**>  goto vent_op;
    <**>end;
    <*-4*>
      disable
      begin integer opk;
    
        opk:= d.op.opkode extract 12;
        funk:= if opk=11 then 1 else
               if opk=12 then 2 else
               if opk=13 then 3 else
               if opk=19 then 4 else
               if opk=20 then 5 else
               if opk=24 then 6 else
               0;
        if funk=0 then fejlreaktion( 2,opk,<:vt_opdater:>,0);
      end;
      res:= 0;
      goto case funk of (indsæt,udtag,omkod,slet,flyt,roker);
    \f

    message procedure vt_opdater side 3 - 820301/cl;
    
    indsæt:
      begin
        integer busnr,ll_id,ll1,omr,gar,sig,tilst,bi,li,s,zi;
    <*+4*>
    <**> if d.op.data(1) shift (-22) <> 0 then
    <**> begin
    <**>   res:= 31; fejlreaktion(10,d.op.data(1),<:indsæt busnr:>,1);
    <**>   goto slut_indsæt;
    <**> end;
    <*-4*>
        busnr:= d.op.data(1) extract 14;
    <*+4*>
    <**> if d.op.data(2) shift (-22) <> 1 then
    <**> begin
    <**>   res:= 31; fejlreaktion(10,d.op.data(2),<:indsæt linie/løb:>,1);
    <**>   goto slut_indsæt;
    <**> end;
    <*-4*>
        ll_id:= d.op.data(2);
        s:= omr:= d.op.data(4) extract 8;
        bi:= søg_omr_bus(busnr,ll1,gar,omr,sig,tilst);
        if bi<0 then
        begin
          if bi=(-1) then res:=10 <*bus ukendt*> else
          if s<>0 then res:= 58 <*ulovligt omr*> else res:= 57 <*omr nødv.*>;
        end
        else
        if s<>0 and s<>omr then
          res:= 58 <* ulovligt område for bus *>
        else
        if intg(bustilstand(bi)) <> 0 then
          res:=(if intg(bustilstand(bi))=(-1) then 18 <* i kø *>
                else 14 <* optaget *>)
        else
        begin
          if linie_løb_indeks(bi) extract 12 <> 0 then
          begin <* linie/løb allerede indsat *>
            res:= 11;
            d.op.data(3):= linie_løb_tabel(linie_løb_indeks(bi) extract 12);
          end
          else
          begin
    \f

    message procedure vt_opdater side 3a - 900108/cl;
    
            if d.op.kilde//100 <> 4 then
            res:= opd_omr(11,gar shift 8 +
              bustabel1(bi) extract 8,busnr,ll_id);
            if res>3 then goto slut_indsæt;
            s:= binærsøg(sidste_linie_løb,linie_løb_tabel(li) - ll_id,li);
            if s=0 then <* linie/løb findes allerede *>
            begin
              sig:= busindeks(li) extract 12;
              d.op.data(3):= bustabel(sig);
              linie_løb_indeks(sig):= false;
              disable modiffil(tf_vogntabel,sig,zi);
              fil(zi).ll:= 0;
              fil(zi).bn:= bustabel(sig) extract 14 add
                           (bustabel1(sig) extract 8 shift 14);
              opd_log(d.op.kilde,2,bustabel(sig),ll_id,0);
    
              linie_løb_indeks(bi):= false add li;
              busindeks(li):= false add bi;
              disable modiffil(tf_vogntabel,bi,zi);
              fil(zi).ll:= ll_id;
              fil(zi).bn:= bustabel(bi) extract 14 add
                           (bustabel1(bi) extract 8 shift 14);
              opd_log(d.op.kilde,1,busnr,0,ll_id);
              res:= 3;
            end
            else
            begin
    \f

    message procedure vt_opdater side 4 - 810527/cl;
    
              if s<0 then li:= li +1;
              if sidste_linie_løb=max_antal_linie_løb then
              begin
                fejlreaktion(10,max_antal_linie_løb,<:for mange linie/løb:>,1);
                res:= 31;
              end
              else
              begin
                for i:= sidste_linie_løb step -1 until li do
                begin
                  linie_løb_tabel(i+1):=linie_løb_tabel(i);
                  linie_løb_indeks(bus_indeks(i) extract 12):=false add (i+1);
                  bus_indeks(i+1):=bus_indeks(i);
                end;
                sidste_linie_løb:= sidste_linie_løb +1;
                linie_løb_tabel(li):= ll_id;
                linie_løb_indeks(bi):= false add li;
                busindeks(li):= false add bi;
                disable s:= modiffil(tf_vogntabel,bi,zi);
                if s<>0 then fejlreaktion(7,s,<:vt_indsæt:>,0);
                fil(zi).bn:= busnr extract 14 add
                             (bustabel1(bi) extract 8 shift 14);
                fil(zi).ll:= ll_id;
                opd_log(d.op.kilde,1,busnr,0,ll_id);
                res:= 3; <* ok *>
              end;
            end;
          end;
        end;
    slut_indsæt:
        d.op.resultat:= res;
      end;
      goto returner;
    \f

    message procedure vt_opdater side 5 - 820301/cl;
    
    udtag:
      begin
        integer busnr,ll_id,omr,gar,sig,bi,li,s,format,tilst,zi;
    
        busnr:= ll_id:= 0;
        omr:= s:= d.op.data(2) extract 8;
        format:= d.op.data(1) shift (-22);
        if format=0 then <*busnr*>
        begin
          busnr:= d.op.data(1) extract 14;
          bi:= søg_omr_bus(busnr,ll_id,gar,omr,sig,tilst);
          if bi<0 then
          begin
            if bi=-1 then res:= 10 else
            if s<>0 then res:= 58 else res:= 57;
            goto slut_udtag;
          end;
          if bi>0 and s<>0 and s<>omr then
          begin
            res:= 58; goto slut_udtag;
          end;
          li:= linie_løb_indeks(bi) extract 12;
          busnr:= bustabel(bi);
          if li=0 or linie_løb_tabel(li)=0 then
          begin <* bus ej indsat *>
            res:= 13;
            goto slut_udtag;
          end;
          ll_id:= linie_løb_tabel(li);
        end
        else
        if format=1 then <* linie_løb *>
        begin
          ll_id:= d.op.data(1);
          s:= binærsøg(sidste_linie_løb,linie_løb_tabel(li)-ll_id,li);
          if s<>0 then
          begin <* linie/løb findes ikke *>
            res:= 9;
            goto slut_udtag;
          end;
          bi:= busindeks(li) extract 12;
          busnr:= bustabel(bi);
        end
        else <* ulovlig identifikation *>
        begin
          res:= 31;
          fejlreaktion(10,d.op.data(1),<:udtag ident:>,1);
          goto slut_udtag;
        end;
    \f

    message procedure vt_opdater side 6 - 820301/cl;
    
       tilst:= intg(bustilstand(bi));
        if tilst<>0 then
        begin
          res:= if tilst = -1 then 18<*i kø*> else 14<*optaget*>;
          goto slut_udtag;
        end;
        if d.op.kilde//100 <> 4 then
        res:= opd_omr(12, bustabel(bi) shift (-14) extract 8 shift 8 +
                bustabel1(bi) extract 8,bustabel(bi) extract 14,0);
        if res>3 then goto slut_udtag;
        linie_løb_indeks(bi):= false;
        for i:= li step 1 until sidste_linie_løb -1 do
        begin
          linie_løb_tabel(i):= linie_løb_tabel(i+1);
          linie_løb_indeks(bus_indeks(i+1) extract 12):= false add i;
          bus_indeks(i):= bus_indeks(i+1);
        end;
        linie_løb_tabel(sidste_linie_løb):= 0;
        bus_indeks(sidste_linie_løb):= false;
        sidste_linie_løb:= sidste_linie_løb -1;
        disable s:= modif_fil(tf_vogntabel,bi,zi);
        if s<>0 then fejlreaktion(7,s,<:vt_udtag:>,0);
        fil(zi).ll:= 0;
        fil(zi).bn:= busnr add (bustabel1(bi) extract 8 shift 14);
        opd_log(d.op.kilde,2,busnr,ll_id,0);
        res:= 3; <* ok *>
    slut_udtag:
        d.op.resultat:= res;
        d.op.data(2):= ll_id;
        d.op.data(3):= busnr;
      end;
      goto returner;
    \f

    message procedure vt_opdater side 7 - 851001/cl;
    
    omkod:
    flyt:
    roker:
      begin
        integer ll_id1,ll_id2,inf1,inf2,i,s,bi1,bi2,li1,li2,tilst,zi,pm1;
    
        inf1:= inf2:= 0;
        ll_id1:= d.op.data(1);
        ll_id2:= d.op.data(2);
        if ll_id1=ll_id2 then
        begin
          res:= 24; inf1:= ll_id2;
          goto slut_flyt;
        end;
    <*+4*>
    <**>  for i:= 1,2 do
    <**>    if d.op.data(i) shift (-22) <> 1 then
    <**>    begin
    <**>      res:= 31;
    <**>      fejlreaktion(10,d.op.data(i),case i of (
    <**>        <:omkod/flyt/roker ident1:>,<:omkod/flyt/roker ident2:>),1);
    <**>      goto slut_flyt;
    <**>    end;
    <*-4*>
    
        s:= binærsøg(sidste_linie_løb,linie_løb_tabel(li1) - ll_id1,li1);
        if s<>0 and funk=6 <* roker *> then
        begin
          i:= ll_id1; ll_id1:= ll_id2; ll_id2:= i;
          s:= binærsøg(sidste_linie_løb,linie_løb_tabel(li1) - ll_id1,li1);
        end;
        if s<>0 then
        begin
          res:= 9; <* ukendt linie/løb *>
          goto slut_flyt;
        end;
        bi1:= busindeks(li1) extract 12;
        inf1:= bustabel(bi1);
        tilst:= intg(bustilstand(bi1));
        if tilst<>0 then <* bus ikke fri *>
        begin
          res:= if tilst=-1 then 18 <* i kø *> else 14 <*optaget*>;
          goto slut_flyt;
        end;
    \f

    message procedure vt_opdater side 7a- 851001/cl;
        if d.op.kilde//100 <> 4 then
    
        res:= opd_omr(11, bustabel(bi1) shift (-14) extract 8 shift 8 +
                bustabel1(bi1) extract 8, inf1 extract 14, ll_id2);
        if res>3 then goto slut_flyt;
    
        s:= binærsøg(sidste_linie_løb,linie_løb_tabel(li2) - ll_id2,li2);
        if s=0 then
        begin <* ll_id2 er indkodet *>
          bi2:= busindeks(li2) extract 12;
          inf2:= bustabel(bi2);
          tilst:= intg(bustilstand(bi2));
          if funk=3 then res:= 12 <* ulovlig ved omkod *> else
          if tilst=-1 then res:= 18 else if tilst<>0 then res:= 14;
          if res>3 then
          begin
            inf1:= inf2; inf2:= 0;
            goto slut_flyt;
          end;
    
          if d.op.kilde//100 <> 4 then
          res:= opd_omr(11, bustabel(bi2) shift (-14) extract 8 shift 8 +
                  bustabel1(bi2) extract 8, inf2 extract 14, ll_id1);
          if res>3 then goto slut_flyt;
    
          <* flyt bus *>
          if funk=6 then
            linie_løb_indeks(bi2):= false add li1
          else
            linie_løb_indeks(bi2):= false;
          linie_løb_indeks(bi1):= false add li2;
          if funk=6 then
            busindeks(li1):= false add bi2
          else
            busindeks(li1):= false;
          busindeks(li2):= false add bi1;
    
         if funk<>6 then
         begin
          <* fjern ll_id1 *>
          for i:= li1 step 1 until sidste_linie_løb - 1 do
          begin
            linie_løb_tabel(i):= linie_løb_tabel(i+1);
            linie_løb_indeks(intg(busindeks(i+1))):= false add i;
            busindeks(i):= busindeks(i+1);
          end;
          linie_løb_tabel(sidste_linie_løb):= 0;
          bus_indeks(sidste_linie_løb):= false;
          sidste_linie_løb:= sidste_linie_løb-1;
         end;
    
          <* opdater vogntabelfil *>
          disable s:= modiffil(tf_vogntabel,bi2,zi);
          if s<>0 then fejlreaktion(7,s,<:vt-omkod/flyt:>,0);
          fil(zi).ll:= if funk=6 then ll_id1 else 0;
          fil(zi).bn:= inf2 extract 14 add (bustabel1(bi2) extract 8 shift 14);
          if funk=6 then
            opd_log(d.op.kilde,3,bustabel(bi2),ll_id2,ll_id1)
          else
            opd_log(d.op.kilde,2,bustabel(bi2),ll_id2,0);
          disable s:= modiffil(tf_vogntabel,bi1,zi);
          if s<>0 then fejlreaktion(7,s,<:vt-omkod/flyt:>,0);
          fil(zi).ll:= ll_id2;
          fil(zi).bn:= inf1 extract 14 add (bustabel1(bi1) extract 8 shift 14);
          opd_log(d.op.kilde,3,bustabel(bi1),ll_id1,ll_id2);
    \f

    message procedure vt_opdater side 8 - 820301/cl;
    
        end <* ll_id2 indkodet *>
        else
        begin
          if sign(s)=sign(li2-li1) then li2:=li2-sign(s);
          <* li2 skal være indeks for sidste linie/løb der skal flyttes i vt *>
          pm1:= sgn(li2-li1);
          for i:= li1 step pm1 until li2-pm1 do
          begin
            linie_løb_tabel(i):= linie_løb_tabel(i+pm1);
            busindeks(i):= busindeks(i+pm1);
            linie_løb_indeks(intg(busindeks(i+pm1))):= false add i;
          end;
          linie_løb_tabel(li2):= ll_id2;
          busindeks(li2):= false add bi1;
          linie_løb_indeks(bi1):= false add li2;
          disable s:= modiffil(tf_vogntabel,bi1,zi);
          if s<>0 then fejlreaktion(7,s,<:vt-omkod/flyt:>,0);
          fil(zi).ll:= ll_id2;
          fil(zi).bn:= inf1 extract 14 add (bustabel1(bi1) extract 8 shift 14);
          opd_log(d.op.kilde,3,bustabel(bi1),ll_id1,ll_id2);
        end;
        res:= 3; <*udført*>
    slut_flyt:
        d.op.resultat:= res;
        d.op.data(3):= inf1;
        if funk=5 then d.op.data(4):= inf2;
      end;
      goto returner;
    \f

    message procedure vt_opdater side 9 - 851001/cl;
    
    slet:
      begin
        integer flin,slin,finx,sinx,s,li,bi,omr,gar;
        boolean test24;
    
        if d.op.data(2)=0 then d.op.data(2):= d.op.data(1);
        omr:= d.op.data(3);
    
        if d.op.data(1) > d.op.data(2) then
        begin
          res:= 44; <* intervalstørrelse ulovlig *>
          goto slut_slet;
        end;
    
        flin:= (1 shift 22) + (d.op.data(1) extract 21 shift 7);
        slin:= (1 shift 22) + (d.op.data(2) extract 21 shift 7) + 127;
    
        s:= binærsøg(sidste_linie_løb, (linie_løb_tabel(finx)-flin), finx);
        if s<0 then finx:= finx+1;
        s:= binærsøg(sidste_linie_løb, (linie_løb_tabel(sinx)-slin), sinx);
        if s>0 then sinx:= sinx-1;
    
        for li:= finx step 1 until sinx do
        begin
          bi:= busindeks(li) extract 12;
          gar:= bustabel(bi) shift (-14) extract 8;
          if intg(bustilstand(bi))=0 and 
             (omr = 0 or (omr > 0 and omr = gar) or
              (omr < 0 and omr extract 8 = bustabel1(bi) extract 8)) then
          begin
            opd_log(d.op.kilde,2,bustabel(bi),linie_løb_tabel(li),0);
            linie_løb_indeks(bi):= busindeks(li):= false;
            linie_løb_tabel(li):= 0;
          end;
        end;
    \f

    message procedure vt_opdater side 10 - 850820/cl;
    
        sinx:= finx-1;
        for li:= finx step 1 until sidste_linie_løb do
        begin
          if linie_løb_tabel(li)<>0 then
          begin
            sinx:= sinx+1;
            if sinx<>li then
            begin
              linie_løb_tabel(sinx):= linie_løb_tabel(li);
              busindeks(sinx):= busindeks(li);
              linie_løb_indeks(busindeks(sinx) extract 12):= false add sinx;
              linie_løb_tabel(li):= 0;
              busindeks(li):= false;
            end;
          end;
        end;
        sidste_linie_løb:= sinx;
    
        test24:= testbit24; testbit24:= false;
        for bi:= 1 step 1 until sidste_bus do 
        disable
        begin
          s:= modiffil(tf_vogntabel,bi,finx);
          if s<>0 then fejlreaktion(7,s,<:vt-slet:>,0);
          fil(finx).bn:= bustabel(bi) extract 14 add
                         (bustabel1(bi) extract 8 shift 14);
          fil(finx).ll:= linie_løb_tabel(linie_løb_indeks(bi) extract 12);
        end;
        testbit24:= test24;
        res:= 3;
    
    slut_slet:
        d.op.resultat:= res;
      end;
      goto returner;
    \f

    message procedure vt_opdater side 11 - 810409/cl;
    
    returner:
      disable
      begin
    
    <*+2*>
    <**>  if testbit40 and overvåget then
    <**>  begin
    <**>    skriv_vt_opd(out,0);
    <**>    write(out,<:   vogntabel efter ændring:>);
    <**>    p_vogntabel(out);
    <**>  end;
    <**>  if testbit41 and overvåget then
    <**>  begin
    <**>    skriv_vt_opd(out,0);
    <**>    write(out,<:   returner operation:>);
    <**>    skriv_op(out,op);
    <**>  end;
    <*-2*>
    
        signalch(d.op.retur,op,d.op.optype);
      end;
      goto vent_op;
    
    vt_opd_trap:
      disable skriv_vt_opd(zbillede,1);
    
    end vt_opdater;
    \f

    message procedure vt_tilstand side 1 - 810424/cl;
    
    procedure vt_tilstand(cs_fil,fil_opref);
      value               cs_fil,fil_opref;
      integer             cs_fil,fil_opref;
    begin
      integer array field op,filop;
      integer funk,format,busid,res,bi,tilst,opk,opk_indeks,
              g_type,gr,antal,ej_res,zi,li,filref;
      integer array identer(1:max_antal_i_gruppe);
    
      procedure skriv_vt_tilst(zud,omfang);
        value                      omfang;
        zone                   zud;
        integer                    omfang;
      begin
        real array field raf;
        raf:= 0;
        write(zud,"nl",1,<:+++ vt_tilstand          :>);
        if omfang <> 0 then
        begin
          skriv_coru(zud,abs curr_coruno);
          write(zud,"nl",1,<<d>,
            <:cs-fil     :>,cs_fil,"nl",1,
            <:filop      :>,filop,"nl",1,
            <:op         :>,op,"nl",1,
            <:funk       :>,funk,"nl",1,
            <:format     :>,format,"nl",1,
            <:busid      :>,busid,"nl",1,
            <:res        :>,res,"nl",1,
            <:bi         :>,bi,"nl",1,
            <:tilst      :>,tilst,"nl",1,
            <:opk        :>,opk,"nl",1,
            <:opk-indeks :>,opk_indeks,"nl",1,
            <:g-type     :>,g_type,"nl",1,
            <:gr         :>,gr,"nl",1,
            <:antal      :>,antal,"nl",1,
            <:ej-res     :>,ej_res,"nl",1,
            <:zi         :>,zi,"nl",1,
            <:li         :>,li,"nl",1,
            <::>);
          write(zud,"nl",1,<:identer:>);
          skriv_hele(zud,identer.raf,max_antal_i_gruppe*2,2);
        end;
      end;
    
        procedure sorter_gruppe(tab,l,u);
          value                     l,u;
          integer array         tab;
          integer                   l,u;
        begin
          integer array field ii,jj;
          integer array ww, xx(1:2);
    
          integer procedure sml(a,b);
            integer array       a,b;
          begin
            integer res;
    
            res:= sign((a(1) shift (-8) extract 4) - (b(1) shift (-8) extract 4));
            if res = 0 then
              res:= sign((b(1) shift (-18)) - (a(1) shift (-18)));
            if res = 0 then
              res:=
                 sign((a(1) shift (-12) extract 6) - (b(1) shift (-12) extract 6));
            if res = 0 then
              res:= sign((a(2) extract 14) - (b(2) extract 14));
            sml:= res;
          end;
    
          ii:= ((l+u)//2 - 1)*4;
          tofrom(xx,tab.ii,4);
          ii:= (l-1)*4; jj:= (u-1)*4;
          repeat
            while sml(tab.ii,xx) < 0 do ii:= ii+4;
            while sml(xx,tab.jj) < 0 do jj:= jj-4;
            if ii <= jj then
            begin
              tofrom(ww,tab.ii,4);
              tofrom(tab.ii,tab.jj,4);
              tofrom(tab.jj,ww,4);
              ii:= ii+4;
              jj:= jj-4;
            end;
          until ii>jj;
          if l < jj//4+1 then sorter_gruppe(tab,l,jj//4+1);
          if ii//4+1 < u then sorter_gruppe(tab,ii//4+1,u);
        end;
    \f

    message procedure vt_tilstand side 2 - 820301/cl;
    
      filop:= filopref;
      stackclaim(if cm_test then 550 else 500);
      trap(vt_tilst_trap);
    
    <*+2*>
    <**> disable if testbit47 and overvåget or testbit28 then
    <**>   skriv_vt_tilst(out,0);
    <*-2*>
    
    vent_op:
      waitch(cs_vt_tilst,op,vt_optype or gen_optype,-1);
    <*+2*>disable
    <**>  if (testbit41 and overvåget) or
             (testbit46 and overvåget and
              (d.op.opkode extract 12 = 16 or d.op.opkode extract 12 = 18))
          then
    <**>  begin
    <**>    skriv_vt_tilst(out,0);
    <**>    write(out,<:   modtaget operation:>);
    <**>    skriv_op(out,op);
    <**>  end;
    <*-2*>
    
    <*+4*>
    <**>  if op <> vt_op then
    <**>  begin
    <**>    disable begin
    <**>      d.op.resultat:= 31;
    <**>      fejlreaktion(11,op,<:vt-tilstand:>,1);
    <**>  end;
    <**>  goto returner;
    <**>  end;
    <*-4*>
    
        opk:= d.op.opkode extract 12;
        funk:= if opk = 14 <*bus i kø*> then 1 else
               if opk = 15 <*bus res *> then 2 else
               if opk = 16 <*grp res *> then 4 else
               if opk = 17 <*bus fri *> then 3 else
               if opk = 18 <*grp fri *> then 5 else
               0;
        if funk = 0 then fejlreaktion(2,opk,<:vt_tilstand:>,0);
        res:= 0;
        format:= d.op.data(1) shift (-22);
    
      goto case funk of(enkelt_bus,enkelt_bus,enkelt_bus,grp_res,grp_fri);
    \f

    message procedure vt_tilstand side 3 - 820301/cl;
    
    enkelt_bus:
      <* sæt enkelt bus i kø, reserver eller frigiv enkelt bus *>
      disable
      begin integer busnr,i,s,tilst,ll,gar,omr,sig;
    <*+4*>
    <**>if format <> 0 and format <> 1 then
    <**>begin
    <**>  res:= 31;
    <**>  fejlreaktion(10,d.op.data(1),<:tilstand ident:>,1);
    <**>  goto slut_enkelt_bus;
    <**>end;
    <*-4*>
        <* find busnr og tilstand *>
        case format+1 of
        begin
          <* 0: budident *>
          begin
            busnr:= d.op.data(1) extract 14;
            s:= omr:= d.op.data(4) extract 8;
            bi:= søg_omr_bus(busnr,ll,gar,omr,sig,tilst);
            if bi<0 then
            begin
              res:= if bi=(-1) then 10 else (if s<>0 then 58 else 57);
              goto slut_enkelt_bus;
            end
            else
            begin
              tilst:= intg(bustilstand(bi));
            end;
          end;
    
          <* 1: linie_løb_ident *>
          begin
            bi:= findbusnr(d.op.data(1),busnr,i,tilst);
            if bi < 0 then <* ukendt linie_løb *>
            begin
              res:= 9;
              goto slut_enkelt_bus;
            end;
          end;
        end case;
    \f

    message procedure vt_tilstand side 4 - 830310/cl;
    
        if funk < 3 then
        begin
          d.op.data(2):= if linie_løb_indeks(bi) extract 12 <> 0 then
                           linie_løb_tabel(linie_løb_indeks(bi) extract 12)
                         else 0;
          d.op.data(3):= bustabel(bi);
          d.op.data(4):= bustabel1(bi);
        end;
    
        <* check tilstand *>
        if funk = 3 <*frigiv*> and tilst >= 0 <*fri/optaget_i_gruppe*> then
          res:= 39 <* bus ikke reserveret *>
        else
        if tilst <> 0 and tilst <> (-1) and funk < 3 then
          res:= 14 <* bus optaget *>
        else
        if funk = 1 <* i kø *>  and tilst = (-1) then
          res:= 18 <* i kø *>
        else
          res:= 3; <*udført*>
    
        if res = 3 then
          bustilstand(bi):= false add (case funk of (-1,-2,0));
    
    slut_enkelt_bus:
        d.op.resultat:= res;
      end <*disable*>;
      goto returner;
    \f

    message procedure vt_tilstand side 5 - 810424/cl;
    
    grp_res:  <* reserver gruppe *>
      disable
      begin
    
    <*+4*>
    <**>  if format <> 2 then
    <**>  begin
    <**>    res:= 31;
    <**>    fejlreaktion(10,d.op.data(1),<:tilstand ident:>,1);
    <**>    goto slut_grp_res_1;
    <**>  end;
    <*-4*>
    
        <* find frit indeks i opkaldstabel *>
        opk_indeks:= 0;
        for i:= max_antal_gruppeopkald step -1 until 1 do
        begin
          if gruppeopkald(i,1)=0 then opk_indeks:= i <*fri plads*> else
          if gruppeopkald(i,1)=d.op.data(1) then res:= 15 <*optaget*>;
        end;
        if opk_indeks = 0 then res:= 32; <* ingen plads *>
        if res <> 0 then goto slut_grp_res_1;
        g_type:= d.op.data(1) shift (-21) extract 1;
        if g_type = 1 <*special gruppe*> then
        begin <*check eksistens*>
          gr:= 0;
          for i:= 1 step 1 until max_antal_grupper do
            if gruppetabel(i) = d.op.data(1) then gr:= i;
          if gr = 0 then <*gruppe ukendt*>
          begin
            res:= 8;
            goto slut_grp_res_1;
          end;
        end;
    
        <* reserver i opkaldstabel *>
        gruppeopkald(opk_indeks,1):= d.op.data(1);
    \f

    message procedure vt_tilstand side 6 - 810428/cl;
    
        <* tilknyt fil *>
        start_operation(filop,curr_coruid,cs_fil,101);
        d.filop.data(1):= 0;  <*postantal*>
        d.filop.data(2):= 256;  <*postlængde*>
        d.filop.data(3):= 1;  <*segmentantal*>
        d.filop.data(4):= 2 shift 10;  <*spool fil*>
        signalch(cs_opret_fil,filop,vt_optype);
    
    slut_grp_res_1:
        if res <> 0 then d.op.resultat:= res;
      end;
      if res <> 0 then goto returner;
    
      waitch(cs_fil,filop,vt_optype,-1);
    
      <* check filsys-resultat *>
      if d.filop.data(9) <> 0 then
        fejlreaktion(13,d.filop.data(9),<:gruppe,res:>,0);
      filref:= d.filop.data(4);
    \f

    message procedure vt_tilstand side 7 - 820301/cl;
      disable if g_type = 0 <*linie-gruppe*> then
      begin
        integer s,i,ll_id;
        integer array field iaf1;
    
        ll_id:= 1 shift 22 + d.op.data(1) shift 7;
        iaf1:= 2;
        s:= binærsøg(sidste_linie_løb,
              linie_løb_tabel(i) - ll_id, i);
        if s < 0 then i:= i +1;
        antal:= ej_res:= 0;
        skrivfil(filref,1,zi);
        if i <= sidste_linie_løb then
        begin
          while linie_løb_tabel(i) shift (-7) shift 7 = ll_id do
          begin
            if (intg(bustilstand(intg(busindeks(i))))<>0) or
               (bustabel1(intg(busindeks(i))) extract 8 <> 3) then
              ej_res:= ej_res+1
            else
            begin
              antal:= antal+1;
              bi:= busindeks(i) extract 12;
              fil(zi).iaf1(1):=
                område_id( bustabel1(bi) extract 8, 2) extract 12 shift 12 +
                (bustabel1(bi) shift (-23) + 1) shift 8 + 1;
              fil(zi).iaf1(2):= bustabel(bi);
              iaf1:= iaf1+4;
              bustilstand(bi):= false add opk_indeks;
            end;
            i:= i +1;
            if i > sidste_linie_løb then goto slut_l_grp;
          end;
        end;
    \f

    message procedure vt_tilstand side 8 - 820301/cl;
    
    slut_l_grp:
      end
      else
      begin <*special gruppe*>
        integer i,s,li,omr,gar,tilst;
        integer array field iaf1;
    
        iaf1:= 2;
        antal:= ej_res:= 0;
        s:= læsfil(tf_gruppedef,gr,zi);
        if s <> 0 then fejlreaktion(5,s,<:gruppe,res:>,0);
        tofrom(identer,fil(zi),max_antal_i_gruppe*2);
        s:= skrivfil(filref,1,zi);
        if s<>0 then fejlreaktion(6,s,<:gruppe,res:>,0);
        i:= 1;
        while identer(i) <> 0 do
        begin
          if identer(i) shift (-22) = 0 then
          begin <*busident*>
            omr:= 0;
            bi:= søg_omr_bus(identer(i),li,gar,omr,s,tilst);
            if bi<0 then goto næste_ident;
            li:= linie_løb_indeks(bi) extract 12;
          end
          else
          begin <*linie/løb ident*>
            s:= binærsøg(sidste_linie_løb,
                  linie_løb_tabel(li) - identer(i), li);
            if s <> 0 then goto næste_ident;
            bi:= busindeks(li) extract 12;
          end;
          if (intg(bustilstand(bi))<>0) or
             (bustabel1(bi) extract 8 <> 3) then
            ej_res:= ej_res+1
          else
          begin
            antal:= antal +1;
            fil(zi).iaf1(1):=
              område_id( bustabel1(bi) extract 8, 2) extract 12 shift 12 +
              (bustabel1(bi) shift (-23) + 1) shift 8 + 1;
            fil(zi).iaf1(2):= bustabel(bi);
            iaf1:= iaf1+4;
            bustilstand(bi):= false add opk_indeks;
          end;
    næste_ident:
          i:= i +1;
          if i > max_antal_i_gruppe then goto slut_s_grp;
        end;
    slut_s_grp:
      end;
    \f

    message procedure vt_tilstand side 9 - 820301/cl;
    
      if antal > 0 then <*ok*>
      disable begin
        integer array field spec,akt;
        integer a;
        integer field antal_spec;
    
        antal_spec:= 2; a:= 0;
        spec:= 2; akt:= 2;
        sorter_gruppe(fil(zi).spec,1,antal);
        fil(zi).antal_spec:= 0;
        while akt//4 < antal do
        begin
          fil(zi).spec(1):= fil(zi).akt(1) shift (-8) shift 8;
          a:= 0;
          while fil(zi).akt(1) shift (-8) = fil(zi).spec(1) shift (-8)
            and a<15 do
          begin
            a:= a+1;
            fil(zi).spec(1+a):= fil(zi).akt(2) extract 14;
            akt:= akt+4;
          end;
          fil(zi).spec(1):= fil(zi).spec(1) + a;
          fil(zi).antal_spec:= fil(zi).antal_spec+1;
          spec:= spec + 2*a + 2;
        end;
        antal:= fil(zi).antal_spec;
        gruppeopkald(opk_indeks,2):= filref;
        d.op.resultat:= 3;
        d.op.data(2):= antal;
        d.op.data(3):= filref;
        d.op.data(4):= ej_res;
      end
      else
      begin
        disable begin
          d.filop.opkode:= 104; <*slet fil*>
          signalch(cs_slet_fil,filop,vt_optype);
          gruppeopkald(opk_indeks,1):= 0; <*fri*>
          d.op.resultat:= 54;
          d.op.data(2):= antal;
          d.op.data(3):= 0;
          d.op.data(4):= ej_res;
        end;
        waitch(cs_fil,filop,vt_optype,-1);
        if d.filop.data(9) <> 0 then
          fejlreaktion(16,d.filop.data(9),<:gruppe,res:>,0);
      end;
      goto returner;
    \f

    message procedure vt_tilstand side 10 - 820301/cl;
    
    grp_fri:  <* frigiv gruppe *>
      disable
      begin integer i,j,s,ll,gar,omr,tilst;
        integer array field spec;
    
    <*+4*>
    <**>  if format <> 2 then
    <**>  begin
    <**>    res:= 31;
    <**>    fejlreaktion(10,d.op.data(1),<:tilstand ident:>,1);
    <**>    goto slut_grp_fri;
    <**>  end;
    <*-4*>
    
        <* find indeks i opkaldstabel *>
        opk_indeks:= 0;
        for i:= 1 step 1 until max_antal_gruppeopkald do
          if gruppeopkald(i,1) = d.op.data(1) then opk_indeks:= i;
        if opk_indeks = 0 <*ikke fundet*> then
        begin
          res:= 40; <*gruppe ej reserveret*>
          goto slut_grp_fri;
        end;
        filref:= gruppeopkald(opk_indeks,2);
        start_operation(filop,curr_coruid,cs_fil,104);
        d.filop.data(4):= filref;
        hentfildim(d.filop.data);
        læsfil(filref,1,zi);
        spec:= 0;
        antal:= fil(zi).spec(1);
        spec:= spec+2;
        for i:= 1 step 1 until antal do
        begin
          for j:= 1 step 1 until fil(zi).spec(1) extract 8 do
          begin
            busid:= fil(zi).spec(1+j) extract 14;
            omr:= 0;
            bi:= søg_omr_bus(busid,ll,gar,omr,s,tilst);
            if bi>=0 then bustilstand(bi):= false;
          end;
          spec:= spec + 2*(fil(zi).spec(1) extract 8) + 2;
        end;
    
    slut_grp_fri:
        d.op.resultat:= res;
      end;
      if res <> 0 then goto returner;
      gruppeopkald(opk_indeks,1):= gruppeopkald(opk_indeks,2):= 0;
      signalch(cs_slet_fil,filop,vt_optype);
    \f

    message procedure vt_tilstand side 11 - 810424/cl;
    
      waitch(cs_fil,filop,vt_optype,-1);
    
      if d.filop.data(9) <> 0 then
        fejlreaktion(16,d.filop.data(9),<:gruppe,fri:>,0);
      d.op.resultat:= 3;
    
    returner:
      disable
      begin
    <*+2*>
    <**>  if testbit40 and overvåget then
    <**>  begin
    <**>    skriv_vt_tilst(out,0);
    <**>    write(out,<:   vogntabel efter ændring:>);
    <**>    p_vogntabel(out);
    <**>  end;
    <**>  if testbit43 and overvåget and (funk=4 or funk=5) then
    <**>  begin
    <**>    skriv_vt_tilst(out,0); write(out,<:   gruppetabel efter ændring:>);
    <**>    p_gruppetabel(out);
    <**>  end;
    <**>  if (testbit41 and overvåget) or
    <**>     (testbit46 and overvåget and (funk=4 or funk=5)) then
    <**>  begin
    <**>    skriv_vt_tilst(out,0);
    <**>    write(out,<:   returner operation:>);
    <**>    skriv_op(out,op);
    <**>  end;
    <*-2*>
        signalch(d.op.retur,op,d.op.optype);
      end;
      goto vent_op;
    
    vt_tilst_trap:
      disable skriv_vt_tilst(zbillede,1);
    
    end vt_tilstand;
    \f

    message procedure vt_rapport side 1 - 810428/cl;
    
    procedure vt_rapport(cs_fil,fil_opref);
      value              cs_fil,fil_opref;
      integer            cs_fil,fil_opref;
    begin
      integer array field op,filop;
      integer funk,filref,antal,id_ant,res;
      integer field i1,i2;
    
      procedure skriv_vt_rap(z,omfang);
        value                  omfang;
        zone                 z;
        integer                omfang;
      begin
        write(z,"nl",1,<:+++ vt_rapport           :>);
        if omfang <> 0 then
        begin
          skriv_coru(z,abs curr_coruno);
          write(z,"nl",1,<<d>,
            <:  cs_fil  :>,cs_fil,"nl",1,
            <:  filop   :>,filop,"nl",1,
            <:  op      :>,op,"nl",1,
            <:  funk    :>,funk,"nl",1,
            <:  filref  :>,filref,"nl",1,
            <:  antal   :>,antal,"nl",1,
            <:  id-ant  :>,id_ant,"nl",1,
            <:  res     :>,res,"nl",1,
            <::>);
    
          end;
      end skriv_vt_rap;
    
      stackclaim(if cm_test then 198 else 146);
      filop:= fil_opref;
      i1:= 2; i2:= 4;
      trap(vt_rap_trap);
    
    <*+2*>
    <**> disable if testbit47 and overvåget or testbit28 then
    <**>   skriv_vt_rap(out,0);
    <*-2*>
    \f

    message procedure vt_rapport side 2 - 810505/cl;
    
    vent_op:
      waitch(cs_vt_rap,op,gen_optype or vt_optype,-1);
    
    <*+2*>
    <**>  disable begin
    <**>  if testbit41 and overvåget then
    <**>  begin
    <**>    skriv_vt_rap(out,0);
    <**>    write(out,<:   modtaget operation:>);
    <**>    skriv_op(out,op);
    <**>    ud;
    <**>  end;
    <**>  end;<*disable*>
    <*-2*>
    
      disable
      begin
        integer opk;
    
        opk:= d.op.opkode extract 12;
        funk:= if opk = 9 then 1 else
               if opk =10 then 2 else
               0;
        if funk = 0 then fejlreaktion(2,opk,<:vt_gruppe:>,0);
    
        <* opret og tilknyt fil *>
        start_operation(filop,curr_coruid,cs_fil,101);
        d.filop.data(1):= 0; <*postantal(midlertidigt)*>
        d.filop.data(2):= 2; <*postlængde*>
        d.filop.data(3):=10; <*segmenter*>
        d.filop.data(4):= 2 shift 10; <*spool fil*>
        signalch(cs_opretfil,filop,vt_optype);
      end;
    
      waitch(cs_fil,filop,vt_optype,-1);
    
      <* check resultat *>
      if d.filop.data(9) <> 0 then
       fejlreaktion(13,d.filop.data(9),<:vt-rapport:>,0);
      filref:= d.filop.data(4);
      antal:= 0;
      goto case funk of (l_rapport,b_rapport);
    \f

    message procedure vt_rapport side 3 - 850820/cl;
    
    l_rapport:
      disable
      begin
        integer i,j,s,ll,zi;
        idant:= 0;
        for id_ant:= id_ant+1 while d.op.data(id_ant)<>0 and id_ant<5 do 
    <*+4*>
    <**> if d.op.data(id_ant) shift (-22) <> 2 then
    <**> begin
    <**>   res:= 31;
    <**>   fejlreaktion(10,d.op.data(id_ant),<:l-rapport ident:>,1);
    <**>   goto l_rap_slut;
    <**> end;
    <*-4*>
        ;
    
        for i:= 1 step 1 until id_ant do
        begin
          ll:= (1 shift 22) + d.op.data(i) extract 15 shift 7;
          s:= binærsøg(sidste_linie_løb,
                     linie_løb_tabel(j) - ll, j);
          if s < 0 then j:= j +1;
    
          if j<= sidste_linie_løb then
          begin <* skriv identer *>
            while linie_løb_tabel(j) shift (-7) shift 7 = ll do
            begin
              antal:= antal +1;
              s:= skrivfil(filref,antal,zi);
              if s <> 0 then fejlreaktion(6,s,<:vt_rapport:>,0);
              fil(zi).i1:= linie_løb_tabel(j);
              fil(zi).i2:= bustabel(busindeks(j) extract 12);
              j:= j +1;
              if j > sidste_bus then goto linie_slut;
            end;
          end;
    linie_slut:
        end;
        res:= 3;
    l_rap_slut:
      end <*disable*>;
      goto returner;
    \f

    message procedure vt_rapport side 4 - 820301/cl;
    
    b_rapport:
      disable
      begin
        integer i,j,s,zi,busnr1,busnr2;
    <*+4*>
    <**> for i:= 1,2 do
    <**>   if d.op.data(i) shift (-14) <> 0 then
    <**>   begin
    <**>     res:= 31;
    <**>     fejlreaktion(10,d.op.data(i),<:b-rapport ident:>,1);
    <**>     goto bus_slut;
    <**>   end;
    <*-4*>
    
        busnr1:= d.op.data(1) extract 14;
        busnr2:= if d.op.data(2) = 0 then busnr1 else d.op.data(2) extract 14;
        if busnr1 = 0 or busnr2 < busnr1 then
        begin
          res:= 7; <* fejl i busnr *>
          goto bus_slut;
        end;
    
        s:= binærsøg(sidste_bus,bustabel(j) extract 14
                       - busnr1,j);
        if s < 0 then j:= j +1;
        while j>1 and bustabel(j-1) extract 14 >= busnr1 do j:= j-1;
        if j <= sidste_bus then
        begin <* skriv identer *>
          while bustabel(j) extract 14 <= busnr2 do
          begin
            i:= linie_løb_indeks(j) extract 12;
            if i<>0 then
            begin
              antal:= antal +1;
              s:= skriv_fil(filref,antal,zi);
              if s <> 0 then fejlreaktion(6,s,<:vt-rapport:>,0);
              fil(zi).i1:= bustabel(j);
              fil(zi).i2:= linie_løb_tabel(i);
            end;
            j:= j +1;
            if j > sidste_bus then goto bus_slut;
          end;
        end;
    bus_slut:
      end <*disable*>;
      res:= 3; <*ok*>
    \f

    message procedure vt_rapport side 5 - 810409/cl;
    
    returner:
      disable
      begin
        d.op.resultat:= res;
        d.op.data(6):= antal;
        d.op.data(7):= filref;
        d.filop.data(1):= antal;
        d.filop.data(3):= (antal*d.filop.data(2) -1)//256 +1;
        i:= sæt_fil_dim(d.filop.data);
        if i <> 0 then fejlreaktion(9,i,<:vt-rapport:>,0);
    <*+2*>
    <**>  if testbit41 and overvåget then
    <**>  begin
    <**>    skriv_vt_rap(out,0);
    <**>    write(out,<:   returner operation:>);
    <**>    skriv_op(out,op);
    <**>  end;
    <*-2*>
        signalch(d.op.retur,op,d.op.optype);
      end;
      goto vent_op;
    
    vt_rap_trap:
      disable skriv_vt_rap(zbillede,1);
    
    end vt_rapport;
    \f

    message procedure vt_gruppe side 1 - 810428/cl;
    
    procedure vt_gruppe(cs_fil,fil_opref);
    
      value             cs_fil,fil_opref;
      integer           cs_fil,fil_opref;
    begin
      integer array field op, fil_op, iaf;
      integer funk, res, filref, gr, i, antal, zi, s;
      integer array identer(1:(if max_antal_grupper>max_antal_i_gruppe then
                              max_antal_grupper else max_antal_i_gruppe));
    
      procedure skriv_vt_gruppe(zud,omfang);
        value                       omfang;
        integer                     omfang;
        zone                    zud;
      begin
        integer øg;
    
        write(zud,"nl",1,<:+++ vt_gruppe            :>);
        if omfang <> 0 then
        disable
        begin
          skriv_coru(zud,abs curr_coruno);
          write(zud,"nl",1,<<d>,
            <:  cs_fil :>,cs_fil,"nl",1,
            <:  op     :>,op,"nl",1,
            <:  filop  :>,filop,"nl",1,
            <:  funk   :>,funk,"nl",1,
            <:  res    :>,res,"nl",1,
            <:  filref :>,filref,"nl",1,
            <:  gr     :>,gr,"nl",1,
            <:  i      :>,i,"nl",1,
            <:  antal  :>,antal,"nl",1,
            <:  zi     :>,zi,"nl",1,
            <:  s      :>,s,"nl",1,
            <::>);
          raf:= 0;
          system(3,øg,identer);
          write(zud,"nl",1,<:identer::>);
          skriv_hele(zud,identer.raf,øg*2,2);
        end;
      end;
    
      stackclaim(if cm_test then 198 else 146);
      filop:= fil_opref;
      trap(vt_grp_trap);
      iaf:= 0;
    \f

    message procedure vt_gruppe side 2 - 810409/cl;
    
    <*+2*>
    <**> disable if testbit47 and overvåget or testbit28 then
    <**>   skriv_vt_gruppe(out,0);
    <*-2*>
    
    vent_op:
      waitch(cs_vt_grp,op,gen_optype or vt_optype,-1);
    <*+2*>
    <**>disable
    <**>begin
    <**>  if testbit41 and overvåget then
    <**>  begin
    <**>    skriv_vt_gruppe(out,0);
    <**>    write(out,<:   modtaget operation:>);
    <**>    skriv_op(out,op);
    <**>    ud;
    <**>  end;
    <**>end;
    <*-2*>
    
      disable
      begin
        integer opk;
    
        opk:= d.op.opkode extract 12;
        funk:= if opk=25 then 1 else
               if opk=26 then 2 else
               if opk=27 then 3 else
               if opk=28 then 4 else
               0;
        if funk=0 then fejlreaktion(2,opk,<:vt_gruppe:>,0);
      end;
    <*+4*>
    <**> if funk<4 and d.op.data(1) shift (-21) <> 5 then
    <**> begin
    <**>   disable begin
    <**>     d.op.resultat:= 31;
    <**>     fejlreaktion(10,d.op.data(1),<:gruppe ident:>,1);
    <**>   end;
    <**>   goto returner;
    <**> end;
    <*-4*>
    
      goto case funk of(definer,slet,vis,oversigt);
    \f

    message procedure vt_gruppe side 3 - 810505/cl;
    
    definer:
      disable
      begin
        gr:= 0; res:= 0;
        for i:= max_antal_grupper step -1 until 1 do
        begin
          if gruppetabel(i)=0 then gr:= i <*fri plads*> else
          if gruppetabel(i)=d.op.data(1) then res:= 34; <*allerede defineret*>
        end;
        if gr=0 then res:= 32; <*ingen plads*>
      end;
      if res<>0 then goto slut_definer;
      disable
      begin <*fri plads fundet*>
        antal:= d.op.data(2);
        if antal <=0 or max_antal_i_gruppe<antal then
          res:= 33 <*fejl i gruppestørrelse*>
        else
        begin
          for i:= 1 step 1 until antal do
          begin
            s:= læsfil(d.op.data(3),i,zi);
            if s<>0 then fejlreaktion(5,s,<:gruppe,def:>,0);
            identer(i):= fil(zi).iaf(1);
          end;
          s:= modif_fil(tf_gruppedef,gr,zi);
          if s<>0 then fejlreaktion(7,s,<:gruppe,def:>,0);
          tofrom(fil(zi).iaf,identer,antal*2);
          for i:= antal+1 step 1 until max_antal_i_gruppe do
            fil(zi).iaf(i):= 0;
          gruppetabel(gr):= d.op.data(1);
          s:= modiffil(tf_gruppeidenter,gr,zi);
          if s<>0 then fejlreaktion(7,s,<:gruppe,def:>,0);
          fil(zi).iaf(1):= gruppetabel(gr);
          res:= 3;
        end;
      end;
    slut_definer:
      <*slet fil*>
      start_operation(fil_op,curr_coruid,cs_fil,104);
      d.filop.data(4):= d.op.data(3);
      signalch(cs_slet_fil,filop,vt_optype);
      waitch(cs_fil,filop,vt_optype,-1);
      if d.filop.data(9)<>0 then fejlreaktion(16,d.filop.data(9),<:gruppe,def:>,0);
      d.op.resultat:= res;
      goto returner;
    \f

    message procedure vt_gruppe side 4 - 810409/cl;
    
    slet:
      disable
      begin
        gr:= 0; res:= 0;
        for i:= 1 step 1 until max_antal_grupper do
        begin
          if gruppetabel(i)=d.op.data(1) then gr:= i;
        end;
        if gr = 0 then res:= 8 <*gruppe ej defineret*>
        else
        begin
          for i:= 1 step 1 until max_antal_gruppeopkald do
            if gruppeopkald(i,1)=d.op.data(1) then res:=15; <*gruppe optaget*>
          if res = 0 then
          begin
            gruppetabel(gr):= 0;
            s:= modif_fil(tf_gruppeidenter,gr,zi);
            if s<>0 then fejlreaktion(7,s,<:gruppe,slet:>,0);
            fil(zi).iaf(1):= gruppetabel(gr);
            res:= 3;
          end;
        end;
        d.op.resultat:= res;
      end;
      goto returner;
    \f

    message procedure vt_gruppe side 5 - 810505/cl;
    
    vis:
      disable
      begin
        res:= 0; gr:= 0; antal:= 0; filref:= 0;
        for i:= 1 step 1 until max_antal_grupper do
          if gruppetabel(i) = d.op.data(1) then gr:= i;
        if gr = 0 then res:= 8
        else
        begin
          s:= læsfil(tf_gruppedef,gr,zi);
          if s<>0 then fejlreaktion(5,s,<:gruppe,vis:>,0);
          for i:= 1 step 1 until max_antal_i_gruppe do
          begin
            identer(i):= fil(zi).iaf(i);
            if identer(i) <> 0 then antal:= antal +1;
          end;
          start_operation(filop,curr_coruid,cs_fil,101);
          d.filop.data(1):= antal;  <*postantal*>
          d.filop.data(2):= 1;      <*postlængde*>
          d.filop.data(3):= (antal-1)//256 + 1; <*segmenter*>
          d.filop.data(4):= 2 shift 10; <*spool fil*>
          d.filop.data(5):= d.filop.data(6):=
          d.filop.data(7):= d.filop.data(8):= 0;   <*navn*>
          signalch(cs_opret_fil,filop,vt_optype);
        end;
      end;
      if res <> 0 then goto slut_vis;
      waitch(cs_fil,filop,vt_optype,-1);
      disable
      begin
        if d.filop.data(9) <> 0 then
          fejlreaktion(13,d.filop.data(9),<:gruppe,vis:>,0);
        filref:= d.filop.data(4);
        for i:= 1 step 1 until antal do
        begin
          s:= skrivfil(filref,i,zi);
          if s <> 0 then fejlreaktion(6,s,<:gruppe,vis:>,0);
          fil(zi).iaf(1):= identer(i);
        end;
        res:= 3;
      end;
    slut_vis:
      d.op.resultat:= res; d.op.data(2):= antal; d.op.data(3):= filref;
      goto returner;
    \f

    message procedure vt_gruppe side 6 - 810508/cl;
    
    oversigt:
      disable
      begin
        res:= 0; antal:= 0; filref:= 0; iaf:= 0;
        for i:= 1 step 1 until max_antal_grupper do
        begin
          if gruppetabel(i) <> 0 then
          begin
            antal:= antal +1;
            identer(antal):= gruppetabel(i);
          end;
        end;
        start_operation(filop,curr_coruid,cs_fil,101);
        d.filop.data(1):= antal;  <*postantal*>
        d.filop.data(2):= 1;      <*postlængde*>
        d.filop.data(3):= if antal = 0 then 1 else
                          (antal-1)//256 +1; <*segm.antal*>
        d.filop.data(4):= 2 shift 10; <*spool fil*>
        d.filop.data(5):= d.filop.data(6):=
        d.filop.data(7):= d.filop.data(8):= 0; <*navn*>
        signalch(cs_opretfil,filop,vt_optype);
      end;
      waitch(cs_fil,filop,vt_optype,-1);
      disable
      begin
        if d.filop.data(9) <> 0 then
          fejlreaktion(13,d.filop.data(9),<:grupper,over:>,0);
        filref:= d.filop.data(4);
        for i:= 1 step 1 until antal do
        begin
          s:= skriv_fil(filref,i,zi);
          if s <> 0 then fejlreaktion(6,s,<:gruppe,over:>,0);
          fil(zi).iaf(1):= identer(i);
        end;
        d.op.resultat:= 3; <*ok*>
        d.op.data(1):= antal;
        d.op.data(2):= filref;
      end;
    \f

    message procedure vt_gruppe side 7 - 810505/cl;
    
    returner:
      disable
      begin
    <*+2*>
    <**>  if testbit43 and overvåget and (funk=1 or funk=2) then
    <**>  begin
    <**>    skriv_vt_gruppe(out,0);
    <**>    write(out,<:   gruppetabel efter ændring:>);
    <**>    p_gruppetabel(out);
    <**>  end;
    <**>  if testbit41 and overvåget then
    <**>  begin
    <**>    skriv_vt_gruppe(out,0);
    <**>    write(out,<:  returner operation:>);
    <**>    skriv_op(out,op);
    <**>  end;
    <*-2*>
      signalch(d.op.retur,op,d.op.optype);
      end;
      goto vent_op;
    
    vt_grp_trap:
      disable skriv_vt_gruppe(zbillede,1);
    
    end vt_gruppe;
    \f

    message procedure vt_spring side 1 - 810506/cl;
    
    procedure vt_spring(cs_spring_retur,spr_opref);
      value             cs_spring_retur,spr_opref;
      integer           cs_spring_retur,spr_opref;
    begin
      integer array field komm_op,spr_op,iaf;
      real nu;
      integer funk,interval,nr,i,s,id1,id2,res,res_inf,medd_kode,zi;
    
      procedure skriv_vt_spring(zud,omfang);
        value                       omfang;
        zone                    zud;
        integer                     omfang;
      begin
        write(zud,"nl",1,<:+++ vt_spring            :>);
        if omfang <> 0 then
        begin
          skriv_coru(zud,abs curr_coruno);
          write(zud,"nl",1,<<d>,
            <:cs-spring-retur:>,cs_spring_retur,"nl",1,
            <:spr-op         :>,spr_op,"nl",1,
            <:komm-op        :>,komm_op,"nl",1,
            <:funk           :>,funk,"nl",1,
            <:interval       :>,interval,"nl",1,
            <:nr             :>,nr,"nl",1,
            <:i              :>,i,"nl",1,
            <:s              :>,s,"nl",1,
            <:id1            :>,id1,"nl",1,
            <:id2            :>,id2,"nl",1,
            <:res            :>,res,"nl",1,
            <:res-inf        :>,res_inf,"nl",1,
            <:medd-kode      :>,medd_kode,"nl",1,
            <:zi             :>,zi,"nl",1,
            <:nu             :>,<<zddddd.dddd>,nu,"nl",1,
            <::>);
        end;
      end;
    \f

    message procedure vt_spring side 2 - 810506/cl;
    
      procedure vt_operation(aktion,id1,id2,res,res_inf);
        value             aktion,id1,id2;
        integer           aktion,id1,id2,res,res_inf;
      begin  <* aktion: 11=indsæt, 12=udtag, 13=omkod *>
        integer array field akt_op;
    
        <* vent på adgang til vogntabel *>
        waitch(cs_vt_adgang,akt_op,true,-1);
    
        <* start operation *>
        disable
        begin
          start_operation(akt_op,curr_coruid,cs_spring_retur,aktion);
          d.akt_op.data(1):= id1;
          d.akt_op.data(2):= id2;
          signalch(cs_vt_opd,akt_op,vt_optype);
        end;
    
        <* afvent svar *>
        waitch(cs_spring_retur,akt_op,vt_optype,-1);
        res:= d.akt_op.resultat;
        res_inf:= d.akt_op.data(3);
    <*+2*>
    <**> disable
    <**>  if testbit45 and overvåget then
    <**>  begin
    <**>    real t;
    <**>    skriv_vt_spring(out,0);
    <**>    write(out,"nl",1,<<zddddd>,systime(4,d.akt_op.tid,t),<:.:>,t);
    <**>    skriv_id(out,springtabel(nr,1),0);
    <**>    write(out,<:.:>,string(extend springtabel(nr,2) shift 24),<:(:>,
    <**>      <<d>,extend springtabel(nr,3) shift (-12) extract 24,<:)::>,
    <**>      if aktion=11 then <:indsæt:> else if aktion=12 then <:udtag:> else
    <**>      if aktion=13 then <:omkod:> else <:***:>,<: - res=:>,
    <**>      d.akt_op.resultat,"sp",2);
    <**>    skriv_id(out,d.akt_op.data(1),8);
    <**>    skriv_id(out,d.akt_op.data(2),8);
    <**>    skriv_id(out,d.akt_op.data(3),8);
    <**>    systime(4,springtid(nr),t);
    <**>    write(out,<:  springtid: :>,<<zd.dd>,entier(t/100),"nl",1);
    <**>  end;
    <*-2*>
    
        <* åbn adgang til vogntabel *>
        disable signalch(cs_vt_adgang,akt_op,gen_optype or vt_optype);
      end vt_operation;
    \f

    message procedure vt_spring side 2a - 810506/cl;
    
      procedure io_meddelelse(medd_no,bus,linie,springno);
        value                 medd_no,bus,linie,springno;
        integer               medd_no,bus,linie,springno;
      begin
        disable start_operation(spr_op,curr_coruid,cs_spring_retur,36);
        d.spr_op.data(1):= medd_no;
        d.spr_op.data(2):= bus;
        d.spr_op.data(3):= linie;
        d.spr_op.data(4):= springtabel(springno,1);
        d.spr_op.data(5):= springtabel(springno,2);
        disable signalch(cs_io,spr_op,io_optype or gen_optype);
        waitch(cs_spring_retur,spr_op,io_optype or gen_optype,-1);
      end;
    
      procedure returner_op(op,res);
        value                  res;
        integer array field op;
        integer                res;
      begin
    <*+2*>
    <**>  disable
    <**>  if testbit41 and overvåget then
    <**>  begin
    <**>    skriv_vt_spring(out,0); write(out,<:   returner operation::>);
    <**>    skriv_op(out,op);
    <**>  end;
    <*-2*>
        d.op.resultat:= res;
        signalch(d.op.retur,op,d.op.optype);
      end;
    \f

    message procedure vt_spring side 3 - 810603/cl;
    
      iaf:= 0;
      spr_op:= spr_opref;
      stack_claim((if cm_test then 198 else 146) + 24);
    
      trap(vt_spring_trap);
    
      for i:= 1 step 1 until max_antal_spring do
      begin
        springtabel(i,1):= springtabel(i,2):= springtabel(i,3):= 0;
        springtid(i):= springstart(i):= 0.0;
      end;
    
    <*+2*>
    <**> disable
    <**> if testbit44 and overvåget then
    <**> begin
    <**>    skriv_vt_spring(out,0);
    <**>    write(out,<:   springtabel efter initialisering:>);
    <**>    p_springtabel(out); ud;
    <**> end;
    <*-2*>
    
    <*+2*>
    <**> disable if testbit47 and overvåget or testbit28 then
    <**>   skriv_vt_spring(out,0);
    <*-2*>
    \f

    message procedure vt_spring side 4 - 810609/cl;
    
    næste_tid: <* find næste tid *>
      disable
      begin
        interval:= -1; <*vent uendeligt*>
        systime(1,0.0,nu);
        for i:= 1 step 1 until max_antal_spring do
          if springtabel(i,3) < 0 then
            interval:= 5
          else
          if springtid(i) <> 0.0 and
          ( (springtid(i)-nu) < interval or interval < 0 ) then
            interval:= (if springtid(i) <= nu then 0 else
                   round(springtid(i) -nu));
        if interval=0 then interval:= 1;
      end;
    \f

    message procedure vt_spring side 4a - 810525/cl;
    
      <* afvent operation eller timeout *>
      waitch(cs_vt_spring,komm_op,vt_optype or gen_optype,interval);
      if komm_op <> 0 then goto afkod_operation;
    
      <* timeout *>
      systime(1,0.0,nu);
      nr:= 1;
    næste_sekv:
      if nr > max_antal_spring then goto næste_tid;
      if springtid(nr) > nu and springtabel(nr,3) > 0 or springstart(nr)=0.0 then
      begin
        nr:= nr +1;
        goto næste_sekv;
      end;
      disable s:= modif_fil(tf_springdef,nr,zi);
      if s <> 0 then fejlreaktion(7,s,<:spring:>,0);
      if springtabel(nr,3) < 0 then
      begin <* hængende spring *>
        if springtid(nr) <= nu then
        begin <* spring ikke udført indenfor angivet interval - annuler *>
          <* find frit løb *>
           disable
           begin
             id2:= 0;
             for i:= 1 step 1 until springtabel(nr,3) extract 12 do
               if fil(zi).iaf(2+i) shift (-22) = 1 then
               id2:= fil(zi).iaf(1) extract 15 shift 7
                   + fil(zi).iaf(2+i) shift (-12) extract 7 +1 shift 22;
          end;
          <* send meddelelse til io *>
          io_meddelelse(5,0,id2,nr);
    
          <* annuler spring*>
          for i:= 1,2,3 do springtabel(nr,i):= 0;
          springtid(nr):= springstart(nr):= 0.0;
        end
        else
        begin <* forsøg igen *>
    \f

    message procedure vt_spring side 5 - 810525/cl;
    
          i:= abs(extend springtabel(nr,3) shift (-12) extract 24);
          if i = 2 <* første spring ej udført *> then
          begin
            id1:= fil(zi).iaf(1) extract 15 shift 7
                + fil(zi).iaf(3) shift (-12) extract 7 +1 shift 22;
            id2:= id1;
            vt_operation(12<*udtag*>,id1,id2,res,res_inf);
          end
          else
          begin
            id1:= fil(zi).iaf(1) extract 15 shift 7
                + fil(zi).iaf(2+i-1) shift (-12) extract 7 +1 shift 22;
            id2:= id1 shift (-7) shift 7
                + fil(zi).iaf(2+i-2) shift (-12) extract 7;
            vt_operation(13<*omkod*>,id1,id2,res,res_inf);
          end;
    
          <* check resultat *>
          medd_kode:= if res = 3 and i = 2 then 7 else
                      if res = 3 and i > 2 then 8 else
                   <* if res = 9 then 1 else
                      if res =12 then 2 else
                      if res =14 then 4 else
                      if res =18 then 3 else *>
                      0;
          if medd_kode > 0 then
            io_meddelelse(medd_kode,res_inf,if res=3 or res=12 then
              id2 else id1,nr);
          if res = 3 then
          begin <* spring udført *>
            disable s:= modiffil(tf_springdef,nr,zi); 
            if s<>0 then fejlreaktion(7,s,<:spring:>,0);
            springtabel(nr,3):= i shift 12 +springtabel(nr,3) extract 12;
            fil(zi).iaf(2+i-1):= 1 shift 22 +fil(zi).iaf(2+i-1) extract 22;
            if i > 2 then fil(zi).iaf(2+i-2):=
              fil(zi).iaf(2+i-2) extract 22 add (1 shift 23);
          end;
        end;
      end <* hængende spring *>
      else
      begin
        i:= spring_tabel(nr,3) shift (-12);
        id1:= fil(zi).iaf(1) extract 15 shift 7
            + fil(zi).iaf(2+i) shift (-12) extract 7 +1 shift 22;
        id2:= fil(zi).iaf(2+i-1) shift (-12) extract 7
            + id1 shift (-7) shift 7;
        vt_operation(13<*omkod*>,id1,id2,res,res_inf);
    \f

    message procedure vt_spring side 6 - 820304/cl;
    
        <* check resultat *>
        medd_kode:= if res = 3 then 8 else
                    if res = 9 then 1 else
                    if res =12 then 2 else
                    if res =14 then 4 else
                    if res =18 then 3 else 
                    if res =60 then 9 else 0;
        if medd_kode > 0 then
          io_meddelelse(medd_kode,res_inf,if res=3 or res=12 then id2 else id1,nr);
    
        <* opdater springtabel *>
        disable s:= modiffil(tf_springdef,nr,zi);
        if s<>0 then fejlreaktion(7,s,<:spring:>,0);
        if fil(zi).iaf(2+i) extract 12 = 0 <*sidste løb*> then
        begin
          io_meddelelse(if res=3 then 6 else 5,0,
            if res=3 then id1 else id2,nr);
          for i:= 1,2,3 do springtabel(nr,i):= 0; <*annuleret*>
          springtid(nr):= springstart(nr):= 0.0;
        end
        else
        begin
          springtid(nr):= springtid(nr) +(fil(zi).iaf(2+i) extract 12)*60.0;
          if res = 3 then
          begin
            fil(zi).iaf(2+i-1):= (1 shift 23) add
                                 (fil(zi).iaf(2+i-1) extract 22);
            fil(zi).iaf(2+i)  := (1 shift 22) add
                                 (fil(zi).iaf(2+i)   extract 22);
            springtabel(nr,3):=(i+1) shift 12 add (springtabel(nr,3) extract 12);
          end
          else
          springtabel(nr,3):= (-i-1) shift 12 add (springtabel(nr,3) extract 12);
        end;
      end;
    <*+2*>
    <**> disable
    <**> if testbit44 and overvåget then
    <**> begin
    <**>   skriv_vt_spring(out,0); write(out,<:   springtabel efter ændring:>);
    <**>   p_springtabel(out); ud;
    <**> end;
    <*-2*>
    
      nr:= nr +1;
      goto næste_sekv;
    \f

    message procedure vt_spring side 7 - 810506/cl;
    
    afkod_operation:
    <*+2*>
    <**>  disable
    <**>  if testbit41 and overvåget then
    <**>  begin
    <**>    skriv_vt_spring(out,0); write(out,<:   modtaget operation:>);
    <**>    skriv_op(out,komm_op);
    <**>  end;
    <*-2*>
    
      disable
      begin integer opk;
    
        opk:= d.komm_op.opkode extract 12;
        funk:= if opk = 30 <*sp,d*> then 5 else
               if opk = 31 <*sp. *> then 1 else
               if opk = 32 <*sp,v*> then 4 else
               if opk = 33 <*sp,o*> then 6 else
               if opk = 34 <*sp,r*> then 2 else
               if opk = 35 <*sp,a*> then 3 else
                  0;
        if funk = 0 then fejlreaktion(2,opk,<:vt_spring:>,0);
    
        if funk <> 6 <*sp,o*> then
        begin <* find nr i springtabel *>
          nr:= 0;
          for i:= 1 step 1 until max_antal_spring do
            if springtabel(i,1) = d.komm_op.data(1) and
               springtabel(i,2) = d.komm_op.data(2) then nr:= i;
        end;
      end;
      if funk = 6 then goto oversigt;
      if funk = 5 then goto definer;
    
      if nr = 0 then
      begin
        returner_op(komm_op,37<*spring ukendt*>);
        goto næste_tid;
    end;
    
      goto case funk of(start,indsæt,annuler,vis);
    \f

    message procedure vt_spring side 8 - 810525/cl;
    
    start:
      if springtabel(nr,3) shift (-12) <> 0 then
      begin returner_op(komm_op,38); goto næste_tid; end;
      disable
      begin <* find linie_løb_og_udtag *>
        s:= modif_fil(tf_springdef,nr,zi);
        if s <> 0 then fejlreaktion(7,s,<:spring,start:>,0);
        id1:= fil(zi).iaf(1) extract 15 shift 7
            + fil(zi).iaf(3) shift (-12) extract 7 +1 shift 22;
        id2:= 0;
      end;
      vt_operation(12,id1,id2,res,res_inf);
    
      disable <* check resultat *>
        medd_kode:= if res = 3 <*ok*> then 7 else
                    if res = 9 <*linie/løb ukendt*> then 1 else
                    if res =14 <*optaget*> then 4 else
                    if res =18 <*i kø*> then 3 else 0;
      returner_op(komm_op,3);
      if medd_kode = 0 then goto næste_tid;
    
      <* send spring-meddelelse til io *>
      io_meddelelse(medd_kode,res_inf,id1,nr);
    
      <* opdater springtabel *>
      disable
      begin
        s:= modif_fil(tf_springdef,nr,zi);
        if s <> 0 then fejlreaktion(7,s,<:spring,start:>,0);
        springtabel(nr,3):= (if res = 3 then 2 else (-2)) shift 12
                            add (springtabel(nr,3) extract 12);
        systime(1,0.0,nu);
        springstart(nr):= nu;
        springtid(nr):= nu +fil(zi).iaf(3) extract 12 *60.0;
        if res = 3 then fil(zi).iaf(3):= fil(zi).iaf(3) add (1 shift 22);
      end;
    <*+2*>
    <**> disable
    <**> if testbit44 and overvåget then
    <**> begin
    <**>   skriv_vt_spring(out,0); write(out,<:   springtabel efter ændring:>);
    <**>   p_springtabel(out); ud;
    <**> end;
    <*-2*>
    
      goto næste_tid;
    \f

    message procedure vt_spring side 9 - 810506/cl;
    
    indsæt:
      if springtabel(nr,3) shift (-12) = 0 then
      begin <* ikke igangsat *>
        returner_op(komm_op,41);
       goto næste_tid;
      end;
      <* find frie linie/løb *>
      disable
      begin
        s:= læs_fil(tf_springdef,nr,zi);
        if s <> 0 then fejlreaktion(5,s,<:spring,reserve:>,0);
        id2:= 0;
        for i:= 1 step 1 until springtabel(nr,3) extract 12 do
          if fil(zi).iaf(2+i) shift (-22) = 1 then
          id2:= 1 shift 22 +fil(zi).iaf(1) extract 15 shift 7
                           +fil(zi).iaf(2+i) shift (-12) extract 7;
          id1:= d.komm_op.data(3);
      end;
    
      if id2<>0 then
        vt_operation(11,id1,id2,res,res_inf)
      else
        res:= 42;
    
      disable <* check resultat *>
      medd_kode:= if res = 3 <*ok*> then 8 else
                  if res =10 <*bus ukendt*> then 0 else
                  if res =11 <*bus allerede indsat*> then 0 else
                  if res =12 <*linie/løb allerede besat*> then 2 else
                  if res =42 <*intet frit linie/løb*> then 5 else 0;
      if res = 11 or res = 12 then d.komm_op.data(4):= res_inf;
      returner_op(komm_op,res);
      if medd_kode = 0 then goto næste_tid;
      
      <* send springmeddelelse til io *>
      if res<>42 then io_meddelelse(medd_kode,id1,id2,nr);
      io_meddelelse(5,0,0,nr);
    \f

    message procedure vt_spring side 9a - 810525/cl;
    
      <* annuler springtabel *>
      for i:= 1,2,3 do springtabel(nr,i):= 0;
      springtid(nr):=  springstart(nr):= 0.0;
    <*+2*>
    <**> disable
    <**> if testbit44 and overvåget then
    <**> begin
    <**>   skriv_vt_spring(out,0); write(out,<:   springtabel efter ændring:>);
    <**>   p_springtabel(out); ud;
    <**> end;
    <*-2*>
    
      goto næste_tid;
    \f

    message procedure vt_spring side 10 - 810525/cl;
    
    annuler:
      disable
      begin <* find evt. frit linie/løb *>
        s:= læs_fil(tf_springdef,nr,zi);
        if s <> 0 then fejlreaktion(5,s,<:spring,annuler:>,0);
        id1:= id2:= 0;
        for i:= 1 step 1 until springtabel(nr,3) extract 12 do
          if fil(zi).iaf(2+i) shift (-22) = 1 then
            id2:= fil(zi).iaf(1) extract 15 shift 7
                + fil(zi).iaf(2+i) shift (-12) extract 7 +1 shift 22;
        returner_op(komm_op,3);
      end;
    
      <* send springmeddelelse til io *>
      io_meddelelse(5,id1,id2,nr);
    
      <* annuler springtabel *>
      for i:= 1,2,3 do springtabel(nr,i):= 0;
      springtid(nr):= springstart(nr):= 0.0;
    <*+2*>
    <**> disable
    <**> if testbit44 and overvåget then
    <**> begin
    <**>   skriv_vt_spring(out,0); write(out,<:   springtabel efter ændring:>);
    <**>   p_springtabel(out); ud;
    <**> end;
    <*-2*>
    
      goto næste_tid;
    
    definer:
      if nr <> 0 then <* allerede defineret *>
      begin
        res:= 36;
        goto slut_definer;
      end;
    
      <* find frit nr *>
      i:= 0;
      for i:= i+1 while i<= max_antal_spring and nr = 0 do
        if springtabel(i,1) = 0 then nr:= i;
      if nr = 0 then
      begin
        res:= 32; <* ingen fri plads *>
        goto slut_definer;
      end;
    \f

    message procedure vt_spring side 11 - 810525/cl;
    
      disable
      begin integer array fdim(1:8),ia(1:32);
        <* læs sekvens *>
        fdim(4):= d.komm_op.data(3);
        s:= hent_fil_dim(fdim);
        if s <> 0 then fejlreaktion(8,s,<:spring,def:>,0);
        if fdim(1) > 30 then
          res:= 35 <* springsekvens for stor *>
        else
        begin
          for i:= 1 step 1 until fdim(1) do
          begin
            s:= læs_fil(fdim(4),i,zi);
            if s <> 0 then fejlreaktion(5,s,<:spring,def:>,0);
            ia(i):= fil(zi).iaf(1) shift 12;
            if i>1 then ia(i-1):= ia(i-1) + fil(zi).iaf(1) shift (-12);
          end;
          s:= modif_fil(tf_springdef,nr,zi);
          if s <> 0 then fejlreaktion(7,s,<:spring,def:>,0);
          fil(zi).iaf(1):= springtabel(nr,1):= d.komm_op.data(1);
          fil(zi).iaf(2):= springtabel(nr,2):= d.komm_op.data(2);
          iaf:= 4;
          tofrom(fil(zi).iaf,ia,60);
          iaf:= 0;
          springtabel(nr,3):= fdim(1);
          springtid(nr):= springstart(nr):= 0.0;
          res:= 3;
        end;
      end;
    \f

    message procedure vt_spring side 11a - 81-525/cl;
    
    slut_definer:
    
      <* slet fil *>
      start_operation(spr_op,curr_coruid,cs_spring_retur,104);
      d.spr_op.data(4):= d.komm_op.data(3); <* filref *>
      signalch(cs_slet_fil,spr_op,vt_optype);
      waitch(cs_spring_retur,spr_op,vt_optype,-1);
      if d.spr_op.data(9) <> 0 then
        fejlreaktion(16,d.spr_op.data(9),<:spring,def:>,0);
      returner_op(komm_op,res);
    <*+2*>
    <**> disable
    <**> if testbit44 and overvåget then
    <**> begin
    <**>   skriv_vt_spring(out,0); write(out,<:    springtabel efter ændring:>);
    <**>   p_springtabel(out); ud;
    <**> end;
    <*-2*>
      goto næste_tid;
    \f

    message procedure vt_spring side 12 - 810525/cl;
    
    vis:
      disable
      begin
        <* tilknyt fil *>
        start_operation(spr_op,curr_coruid,cs_spring_retur,101);
        d.spr_op.data(1):= (springtabel(nr,3) extract 12)*2;
        d.spr_op.data(2):= 1;
        d.spr_op.data(3):= (d.spr_op.data(1) -1)//256 +1;
        d.spr_op.data(4):= 2 shift 10; <* spoolfil *>
        signalch(cs_opret_fil,spr_op,vt_optype);
      end;
    
      <* afvent svar *>
      waitch(cs_spring_retur,spr_op,vt_optype,-1);
      if d.spr_op.data(9) <> 0 then
       fejlreaktion(13,d.spr_op.data(9),<:spring,vis:>,0);
      disable
      begin integer array ia(1:30);
        s:= læs_fil(tf_springdef,nr,zi);
        if s <> 0 then fejlreaktion(5,s,<:spring,vis:>,0);
        iaf:= 4;
        tofrom(ia,fil(zi).iaf,60);
        iaf:= 0;
        for i:= 1 step 1 until d.spr_op.data(1) do
        begin
          s:= skriv_fil(d.spr_op.data(4),(i-1)*2+1,zi);
          if s <> 0 then fejlreaktion(6,s,<:spring,vis:>,0);
          fil(zi).iaf(1):= if ia(i) shift (-22) = 0 then
                           ia(i) shift (-12) extract 7
                         else -(ia(i) shift (-12) extract 7);
          s:= skriv_fil(d.spr_op.data(4),2*i,zi);
          if s <> 0 then fejlreaktion(6,s,<:spring,vis:>,0);
          fil(zi).iaf(1):= if i < d.spr_op.data(1) then
                             (if ia(i+1) shift (-22) <> 0 then -(ia(i) extract 12)
                              else ia(i) extract 12)
                           else 0;
        end;
        d.spr_op.data(1):= d.spr_op.data(1) - 1;
        sæt_fil_dim(d.spr_op.data);
        d.komm_op.data(3):= d.spr_op.data(1);
        d.komm_op.data(4):= d.spr_op.data(4);
        raf:= data+8;
        d.komm_op.raf(1):= springstart(nr);
        returner_op(komm_op,3);
      end;
      goto næste_tid;
    \f

    message procedure vt_spring side 13 - 810525/cl;
    
    oversigt:
      disable
      begin
        <* opret fil *>
        start_operation(spr_op,curr_coruid,cs_spring_retur,101);
        d.spr_op.data(1):= max_antal_spring;
        d.spr_op.data(2):= 4;
        d.spr_op.data(3):= (max_antal_spring -1)//64 +1;
        d.spr_op.data(4):= 2 shift 10; <* spoolfil *>
        signalch(cs_opret_fil,spr_op,vt_optype);
      end;
    
      <* afvent svar *>
      waitch(cs_spring_retur,spr_op,vt_optype,-1);
      if d.spr_op.data(9) <> 0 then
        fejlreaktion(13,d.spr_op.data(9),<:spring,over:>,0);
      disable
      begin
        nr:= 0;
        for i:= 1 step 1 until max_antal_spring do
        begin
          if springtabel(i,1) <> 0 then
          begin
            nr:= nr +1;
            s:= skriv_fil(d.spr_op.data(4),nr,zi);
            if s <> 0 then fejlreaktion(6,s,<:spring,over:>,0);
            fil(zi).iaf(1):= springtabel(i,1);
            fil(zi).iaf(2):= springtabel(i,2);
            fil(zi,2):= springstart(i);
          end;
        end;
        d.spr_op.data(1):= nr;
        s:= sæt_fil_dim(d.spr_op.data);
        if s <> 0 then fejlreaktion(9,s,<:spring,over:>,0);
        d.komm_op.data(1):= nr;
        d.komm_op.data(2):= d.spr_op.data(4);
        returner_op(komm_op,3);
      end;
      goto næste_tid;
    
    vt_spring_trap:
      disable skriv_vt_spring(zbillede,1);
    
    end vt_spring;
    \f

    message procedure vt_auto side 1 - 810505/cl;
    
    procedure vt_auto(cs_auto_retur,auto_opref);
      value           cs_auto_retur,auto_opref;
      integer         cs_auto_retur,auto_opref;
    begin
      integer array field op,auto_op,iaf;
      integer filref,id1,id2,aktion,postnr,sidste_post,interval,res,
              res_inf,i,s,zi,kl,døgnstart;
      real t,nu,næste_tid;
      boolean optaget;
      integer array filnavn,nytnavn(1:4);
    
      procedure skriv_vt_auto(zud,omfang);
        value                     omfang;
        zone                  zud;
        integer                   omfang;
      begin
        long array field laf;
    
        laf:= 0;
        write(zud,"nl",1,<:+++ vt_auto              :>);
        if omfang<>0 then
        begin
          skriv_coru(zud,abs curr_coruno);
          write(zud,"nl",1,<<d>,
            <:cs-auto-retur  :>,cs_auto_retur,"nl",1,
            <:op             :>,op,"nl",1,
            <:auto-op        :>,auto_op,"nl",1,
            <:filref         :>,filref,"nl",1,
            <:id1            :>,id1,"nl",1,
            <:id2            :>,id2,"nl",1,
            <:aktion         :>,aktion,"nl",1,
            <:postnr         :>,postnr,"nl",1,
            <:sidste-post    :>,sidste_post,"nl",1,
            <:interval       :>,interval,"nl",1,
            <:res            :>,res,"nl",1,
            <:res-inf        :>,res_inf,"nl",1,
            <:i              :>,i,"nl",1,
            <:s              :>,s,"nl",1,
            <:zi             :>,zi,"nl",1,
            <:kl             :>,kl,"nl",1,
            <:døgnstart      :>,døgnstart,"nl",1,
            <:optaget        :>,if optaget then <:true:> else <:false:>,"nl",1,
            <:t              :>,<<zddddd.dddd>,t,"nl",1,
            <:nu             :>,nu,"nl",1,
            <:næste-tid      :>,næste_tid,"nl",1,
            <:filnavn        :>,filnavn.laf,"nl",1,
            <:nytnavn        :>,nytnavn.laf,"nl",1,
            <::>);
        end;
      end skriv_vt_auto;
    \f

    message procedure vt_auto side 2 - 810507/cl;
    
      iaf:= 0;
      auto_op:= auto_opref;
      filref:= id1:= id2:= aktion:= postnr:= sidste_post:= 0;
      optaget:= false;
      næste_tid:= 0.0;
      for i:= 1,2,3,4 do filnavn(i):=nytnavn(i):=0;
      stack_claim(if cm_test then 298 else 246);
      trap(vt_auto_trap);
    
    <*+2*>
    <**> disable if testbit47 and overvåget or testbit28 then
    <**>   skriv_vt_auto(out,0);
    <*-2*>
    
    vent:
    
      systime(1,0.0,nu);
      interval:= if filref=0 then (-1) <*uendeligt*> else
                 if næste_tid > nu then round(næste_tid-nu) else
                 if optaget then 5 else 0;
      if interval=0 then interval:= 1;
    
    <*v*> waitch(cs_vt_auto,op,vt_optype or gen_optype,interval);
    
      if op<>0 then goto filskift;
    
      <* vent på adgang til vogntabel *>
    <*v*> waitch(cs_vt_adgang,op,vt_optype,-1);
    
      <* afsend relevant operation til opdatering af vogntabel *>
      start_operation(op,curr_coruid,cs_auto_retur,aktion);
      d.op.data(1):= id1;
      d.op.data(2):= id2;
      signalch(cs_vt_opd,op,vt_optype);
    <*v*> waitch(cs_auto_retur,op,vt_optype,-1);
      res:= d.op.resultat;
      id2:= d.op.data(2);
      res_inf:= d.op.data(3);
    
      <* åbn for vogntabel *>
      signalch(cs_vt_adgang,op,vt_optype or gen_optype);
    \f

    message procedure vt_auto side 3 - 810507/cl;
    
      <* behandl svar fra opdatering *>
    <*+2*>
    <**> disable
    <**> if testbit45 and overvåget then
    <**> begin
    <**>   integer li,lø,bo;
    <**>   skriv_vt_auto(out,0);
    <**>   write(out,"nl",1,<<zddddd>,systime(4,d.op.tid,t),<:.:>,entier t,
    <**>     <:  POSTNR. :>,<<d>,postnr,if aktion=12 then <:: SLET:> else
    <**>     <:: OMKOD:>,<: - RES=:>,res);
    <**>   for i:= 1,2 do
    <**>   begin
    <**>     li:= d.op.data(i);
    <**>     lø:= li extract 7; bo:= li shift (-7) extract 5;
    <**>     if bo<>0 then bo:= bo + 'A' - 1;
    <**>     li:= li shift (-12) extract 10;
    <**>     write(out,<< ddd>,li,false add bo,1,"/",1,<<d>,lø);
    <**>   end;
    <**>   systime(4,næste_tid,t);
    <**>   write(out,<< zddd>,d.op.data(3) extract 14,<:  - AUTOTID::>,
    <**>     << zd.dd>,t/10000,"nl",1);
    <**> end;
    <*-2*>
      if res=31 then
        fejlreaktion(10,aktion,<:AUTO: SYSTEMFEJL:>,1)
      else
      if res<>3 then
      begin
        if -, optaget then
        begin
          disable start_operation(auto_op,curr_coruid,cs_auto_retur,22);
          d.auto_op.data(1):= if res=9 then 1 else if res=12 then 2 else
             if res=18 then 3 else if res=60 then 9 else 4;
          d.auto_op.data(2):= res_inf;
          d.auto_op.data(3):= if res=12 then id2 else id1;
          signalch(cs_io,auto_op,io_optype or gen_optype);
          waitch(cs_auto_retur,auto_op,io_optype or gen_optype,-1);
        end;
        if res=14 or res=18 then <* i kø eller optaget *>
        begin
          optaget:= true;
          goto vent;
        end;
      end;
      optaget:= false;
    \f

    message procedure vt_auto side 4 - 810507/cl;
    
      <* find næste post *>
      disable
      begin
        if postnr=sidste_post then
        begin <* døgnskift *>
          postnr:= 1;
          døgnstart:= systime(4,systid(døgnstart+1,120000),t);
        end
        else postnr:= postnr+1;
        s:= læsfil(filref,postnr,zi);
        if s<>0 then fejlreaktion(5,s,<:auto:>,0);
        aktion:= fil(zi).iaf(1);
        næste_tid:= systid(døgnstart,fil(zi).iaf(2));
        id1:= fil(zi).iaf(3);
        id2:= fil(zi).iaf(4);
      end;
      goto vent;
    \f

    message procedure vt_auto side 5 - 810507/cl;
    
    filskift:
    
    <*+2*>
    <**> disable
    <**> if testbit41 and overvåget then
    <**> begin
    <**>   skriv_vt_auto(out,0);
    <**>   write(out,<:   modtaget operation::>);
    <**>   skriv_op(out,op);
    <**> end;
    <*-2*>
      for i:= 1 step 1 until 4 do filnavn(i):=nytnavn(i):= 0;
      res:= 46;
      if d.op.opkode extract 12 <> 21 then
        fejlreaktion(2,d.op.opkode extract 12,<:auto,filskift:>,0);
      if filref = 0 then goto knyt;
    
      <* gem filnavn til io-meddelelse *>
      disable begin
        integer array fdim(1:8);
        integer array field navn;
        fdim(4):= filref;
        hentfildim(fdim);
        navn:= 8;
        tofrom(filnavn,fdim.navn,8);
      end;
    
      <* frivgiv tilknyttet autofil *>
      disable start_operation(auto_op,curr_coruid,cs_auto_retur,103);
      d.auto_op.data(4):= filref;
      signalch(cs_frigiv_fil,auto_op,vt_optype);
    <*v*> waitch(cs_auto_retur,auto_op,vt_optype,-1);
      if d.auto_op.data(9) <> 0 then
        fejlreaktion(15,d.auto_op.data(9),<:auto,filskift:>,0);
      filref:= aktion:= id1:= id2:= postnr:= sidste_post:= 0;
      optaget:= false;
      næste_tid:= 0.0;
      res:= 3;
    \f

    message procedure vt_auto side 6 - 810507/cl;
    
      <* tilknyt evt. ny autofil *>
    knyt:
      if d.op.data(1)<>0 then
      begin
        disable startoperation(auto_op,curr_coruid,cs_auto_retur,102);
        d.auto_op.data(4):= 30 shift 12; <* contentskey,subno *> 
        for i:= 1,2,3,4 do d.auto_op.data(4+i):= d.op.data(i);
        disable
        begin integer pos1,pos2;
          pos1:= pos2:= 13;
          while læstegn(d.auto_op.data,pos1,i)<>0 do
          begin
            if 'A'<=i and i<='Å' then i:= i - 'A' + 'a';
            skrivtegn(d.auto_op.data,pos2,i);
          end;
        end;
        signalch(cs_tilknyt_fil,auto_op,vt_optype);
    <*v*> waitch(cs_auto_retur,auto_op,vt_optype,-1);
        s:= d.auto_op.data(9);
        if s=0        then res:= 3  <* ok           *> else
        if s=1 or s=2 then res:= 46 <* ukendt navn  *> else
        if s=5 or s=7 then res:= 47 <* galt indhold *> else
        if s=6        then res:= 48 <* i brug       *> else
          fejlreaktion(14,2,<:auto,filskift:>,0);
        if res<>3 then goto returner;
    
        tofrom(nytnavn,d.op.data,8);
    
        <* find første post *>
        disable
        begin
          døgnstart:= systime(5,0.0,t);
          kl:= round t;
          filref:= d.auto_op.data(4);
          sidste_post:= d.auto_op.data(1);
          postnr:= 0;
          for postnr:= postnr+1 while postnr <= sidste_post do
          begin
              s:= læsfil(filref,postnr,zi);
            if s<>0 then fejlreaktion(5,s,<:auto,filskift:>,0);
            if fil(zi).iaf(2) > kl then goto post_fundet;
          end;
          postnr:= 1;
          døgnstart:= systime(4,systid(døgnstart+1,120000),t);
    \f

    message procedure vt_auto side 7 - 810507/cl;
    
    post_fundet:
          s:= læsfil(filref,postnr,zi);
          if s<>0 then fejlreaktion(5,s,<:auto,filskift:>,0);
          aktion:= fil(zi).iaf(1);
          næste_tid:= systid(døgnstart,fil(zi).iaf(2));
          id1:= fil(zi).iaf(3);
          id2:= fil(zi).iaf(4);
          res:= 3;
        end;
      end ny fil;
    
    returner:
      d.op.resultat:= res;
    <*+2*>
    <**> disable
    <**> if testbit41 and overvåget then
    <**> begin
    <**>   skriv_vt_auto(out,0);
    <**>   write(out,<:   returner operation::>);
    <**>   skriv_op(out,op);
    <**> end;
    <*-2*>
      signalch(d.op.retur,op,d.op.optype);
    
      if vt_log_aktiv then
      begin
        waitch(cs_vt_logpool,op,vt_optype,-1);
        startoperation(op,curr_coruid,cs_vt_logpool,0);
        if nytnavn(1)=0 then
          hægtstring(d.op.data.v_tekst,1,<:ophør:>)
        else
          skriv_text(d.op.data.v_tekst,1,nytnavn);
        d.op.data.v_kode:= 4; <*PS (PlanSkift)*>
        systime(1,0.0,d.op.data.v_tid);
        signalch(cs_vt_log,op,vt_optype);
      end;
    
      if filnavn(1)<>0 then
      begin <* meddelelse til io om annulering *>
        disable begin
          start_operation(auto_op,curr_coruid,cs_auto_retur,23<*io_gen_medd*>);
          i:= 1;
          hægtstring(d.auto_op.data,i,<:auto :>);
          skriv_text(d.auto_op.data,i,filnavn);
          hægtstring(d.auto_op.data,i,<: annuleret:>);
          repeat skrivtegn(d.auto_op.data,i,'nul') until (i-1) mod 6 = 0;
          signalch(cs_io,auto_op,io_optype or gen_optype);
        end;
        waitch(cs_auto_retur,auto_op,io_optype or gen_optype,-1);
      end;
      goto vent;
    
    vt_auto_trap:
      disable skriv_vt_auto(zbillede,1);
    
    end vt_auto;
    message procedure vt_log side 1 - 920517/cl;
    
    procedure vt_log;
    begin
      integer i,j,ventetid;
      real dg,t,nu,skiftetid;
      boolean fil_åben;
      integer array ia(1:10),dp,dp1(1:8);
      integer array field op, iaf;
    
      procedure skriv_vt_log(zud,omfang);
        value                    omfang;
        zone                 zud;
        integer                  omfang;
      begin
        write(zud,"nl",1,<:+++ vt-log :>);
        if omfang<>0 then
        begin
          skriv_coru(zud, abs curr_coruno);
          write(zud,"nl",1,<<d>,
            <:i              :>,i,"nl",1,
            <:j              :>,j,"nl",1,
            <:ventetid       :>,ventetid,"nl",1,
            <:dg             :>,<<zddddd.dd>,dg,"nl",1,
            <:t              :>,t,"nl",1,
            <:nu             :>,nu,"nl",1,
            <:skiftetid      :>,skiftetid,"nl",1,
            <:filåben        :>,if fil_åben then <:true:> else <:false:>,"nl",1,
            <:op             :>,<<d>,op,"nl",1,
            <::>);
          raf:= 0;
          write(zud,"nl",1,<:ia::>);
          skrivhele(zud,ia.raf,20,2);
          write(zud,"nl",2,<:dp::>);
          skrivhele(zud,dp.raf,16,2);
          write(zud,"nl",2,<:dp1::>);
          skrivhele(zud,dp1.raf,16,2);
        end;
      end;
    
    message procedure vt_log side 2 - 920517/cl;
    
      procedure slet_fil;
      begin
        integer segm,res;
        integer array tail(1:10);
    
        res:= monitor(42)lookup_entry:(zvtlog,0,tail);
        if res=0 then
        begin
          segm:= tail(10);
          res:=monitor(48)remove_entry:(zvtlog,0,tail);
          if res=0 then
          begin
            close(zvtlog,true);
            open(zvtlog,4,<:vtlogpool:>,0); close(zvtlog,true);
            res:=monitor(42)lookup_entry:(zvtlog,0,tail);
            if res=0 then
            begin
              tail(1):= tail(1)+segm;
              monitor(44)change_entry:(zvtlog,0,tail);
            end;
          end;
        end;
      end;
    
      boolean procedure udvid_fil;
      begin
        integer res,spos;
        integer array tail(1:10);
        zone z(1,1,stderror);
    
        udvid_fil:= false;
        open(z,0,<:vtlogpool:>,0); close(z,true);
        res:= monitor(42)lookup_entry:(z,0,tail);
        if (res=0) and (tail(1) >= vt_log_slicelgd) then
        begin
          tail(1):=tail(1) - vt_log_slicelgd;
          res:=monitor(44)change_entry:(z,0,tail);
          if res=0 then
          begin
            spos:= vt_logtail(1);
            vt_logtail(1):= vt_logtail(1)+vt_log_slicelgd;
            res:=monitor(44)change_entry:(zvtlog,0,vt_logtail);
            if res<>0 then
            begin
              vt_logtail(1):= vt_logtail(1) - vt_log_slicelgd;
              tail(1):= tail(1) + vt_log_slicelgd;
              monitor(44)change_entry:(z,0,tail);
            end
            else
            begin
              setposition(zvtlog,0,spos);
              udvid_fil:= true;
            end;
          end;
        end;
      end;
    
    message procedure vt_log side 3 - 920517/cl;
    
    boolean procedure ny_fil;
    begin
      integer res,i,j;
      integer array nyt(1:4), ia,tail(1:10);
      long array field navn;
      real t;
    
      navn:=0;
      if fil_åben then
      begin
        close(zvtlog,true);
        fil_åben:= false;
        nyt.navn(1):= long<:vtlo:>;
        nyt.navn(2):= long<::>;
        anbringtal(nyt,5,round systime(4,vt_logstart,t),-6);
        j:= 'a' - 1;
        repeat
          res:=monitor(46)rename_entry:(zvtlog,0,nyt);
          if res=3 then
          begin
            j:= j+1;
            if j <= 'å' then skrivtegn(nyt,11,j);
          end;
        until (res<>3) or (j > 'å');
    
        if res=0 then
        begin
          open(zvtlog,4,<:vtlogklar:>,0);
          res:=monitor(42)lookup_entry:(zvtlog,0,tail);
          if res=0 then
            res:=monitor(52)create_areaproc:(zvtlog,0,ia);
          if res=0 then
          begin
            res:=monitor(8)reserve_process:(zvtlog,0,ia);
            if res<>0 then monitor(64)remove_areaproc:(zvtlog,0,ia);
          end;
    
          if res=0 then
          begin
            setposition(zvtlog,0,tail(10)//64);
            navn:= (tail(10) mod 64)*8;
            if (tail(1) <= tail(10)//64) then
              outrec6(zvtlog,512)
            else
              swoprec6(zvtlog,512);
            tofrom(zvtlog.navn,nyt,8);
            tail(10):= tail(10)+1;
            setposition(zvtlog,0,tail(10)//64);
            monitor(44)change_entry:(zvtlog,0,tail);
            close(zvtlog,true);
          end
          else
          begin
            navn:= 0;
            close(zvtlog,true);
            open(zvtlog,4,<:vtlog:>,0);
            slet_fil;
          end;
        end
        else
          slet_fil;
      end;
    
      <* logfilen er nu omdøbt og indskrevet i vtlogklar *>
      <* eller den er blevet slettet.                    *>
    
      open(zvtlog,4,<:vtlog:>,0);
      for i:= 1 step 1 until 10 do vt_logtail(i):= 0;
      iaf:= 2; tofrom(vt_logtail.iaf,vt_logdisc,8);
      vt_logtail(6):= systime(7,0,t);
    
      res:=monitor(40)create_entry:(z_vtlog,0,vt_logtail);
      if res=0 then
      begin
        monitor(50)permanent_entry:(zvtlog,3,ia);
        if res<>0 then
          monitor(48)remove_entry:(zvtlog,0,ia);
      end;
    
      if res=0 then fil_åben:= true;
    
      ny_fil:= fil_åben;
    end ny_fil;
    
    message procedure vt_log side 4 - 920517/cl;
    
    procedure skriv_post(logpost);
      integer array      logpost;
    begin
      integer array field post;
      real t;
    
      if vt_logtail(10)//32 < vt_logtail(1) then
      begin
        outrec6(zvtlog,512);
        post:= (vt_logtail(10) mod 32)*16;
        tofrom(zvtlog.post,logpost,16);
        vt_logtail(10):= vt_logtail(10)+1;
        setposition(zvtlog,0,vt_logtail(10)//32);
        vt_logtail(6):= systime(7,0,t);
        monitor(44)change_entry:(zvtlog,0,vt_logtail);
      end;
    end;
    
    procedure sletsendte;
    begin
      zone z(128,1,stderror), zpool,zlog(1,1,stderror);
      integer array pooltail,tail,ia(1:10);
      integer i,res;
    
      open(zpool,0,<:vtlogpool:>,0); close(zpool,true);
      res:=monitor(42,zpool,0,pooltail);
    
      open(z,4,<:vtlogslet:>,0);
      if monitor(42,z,0,tail)=0 and tail(10)>0 then
      begin
        if monitor(52,z,0,tail)=0 then
        begin
          if monitor(8,z,0,tail)=0 then
          begin
            for i:=1 step 1 until tail(10) do
            begin
              inrec6(z,8);
              open(zlog,0,z,0); close(zlog,true);
              if monitor(42,zlog,0,ia)=0 then
              begin
                if monitor(48,zlog,0,ia)=0 then
                begin
                  pooltail(1):=pooltail(1)+ia(1);
                end;
              end;
            end;
            tail(10):=0;
            monitor(44,z,0,tail);
          end
          else
            monitor(64,z,0,tail);
        end;
        if res=0 then monitor(44,zpool,0,pooltail);
      end;
      close(z,true);
    end;
    
    message procedure vt_log side 5 - 920517/cl;
    
      trap(vt_log_trap);
      stack_claim(200);
    
      fil_åben:= false;
      if -, vt_log_aktiv then goto init_slut;
      open(zvtlog,4,<:vtlog:>,0);
      i:=monitor(42)lookup_entry:(zvtlog,0,vt_logtail);
      if i=0 then
        i:=monitor(52)create_areaproc:(zvtlog,0,ia);
      if i=0 then
      begin
        i:=monitor(8)reserve_process:(zvtlog,0,ia);
        if i<>0 then monitor(64)remove_areaproc:(zvtlog,0,ia);
      end;
    
      if (i=0) and (vt_logtail(1)=0) then
      begin
        close(zvtlog,true);
        monitor(48)remove_entry:(zvtlog,0,ia);
        i:= 1;
      end;
    
      disable
      if i=0 then
      begin
        fil_åben:= true;
        inrec6(zvtlog,512);
        vt_logstart:= zvtlog.v_tid;
        systime(1,0.0,nu);
        if (nu - vt_logstart) < 24*60*60.0 then
        begin
          setposition(zvtlog,0,vt_logtail(10)//32);
          if (vt_logtail(10)//32) < vt_logtail(1) then
          begin
            inrec6(zvtlog,512);
            setposition(zvtlog,0,vt_logtail(10)//32);
          end;
        end
        else
        begin
          if ny_fil then
          begin
            if udvid_fil then
            begin
              systime(1,0.0,dp.v_tid);
              vt_logstart:= dp.v_tid;
              dp.v_kode:=0;
              skriv_post(dp);
            end
            else
            begin
              close(zvtlog,true);
              monitor(48)remove_entry:(zvtlog,0,ia);
              fil_åben:= false;
            end;
          end;
        end;
      end
      else
      begin
        close(zvtlog,true);
        if ny_fil then
        begin
          if udvid_fil then
          begin
            systime(1,0.0,dp.v_tid);
            vt_logstart:= dp.v_tid;
            dp.v_kode:=0;
            skriv_post(dp);
          end
          else
          begin
            close(zvtlog,true);
            monitor(48)remove_entry:(zvtlog,0,ia);
            fil_åben:= false;
          end;
        end;
      end;
    
    init_slut:
    
      dg:= systime(5,0,t);
      if t < vt_logskift then
        skiftetid:= systid(dg,vt_logskift)
      else
        skiftetid:= systid(dg+1,vt_logskift);
    
    message procedure vt_log side 6 - 920517/cl;
    
    vent:
    
      systime(1,0.0,nu); dg:= systime(5,0.0,t);
      ventetid:= round(skiftetid - nu);
      if ventetid < 1 then ventetid:= 1;
    
    <*V*> waitch(cs_vt_log,op,vt_optype,ventetid);
    
      systime(1,0.0,nu); dg:=systime(4,nu,t);
      if op <> 0 then
      begin
        tofrom(dp,d.op.data,16);
        signalch(cs_vt_logpool,op,vt_optype);
      end;
    
      if -, vt_log_aktiv then goto vent;
    
      disable if (op=0) or (nu > skiftetid) then
      begin
        if fil_åben then
        begin
          dp1.v_tid:= systid(dg,vt_logskift);
          dp1.v_kode:= 1;
          if (vt_logtail(10)//32) >= vt_logtail(1) then
          begin
            if udvid_fil then
              skriv_post(dp1);
          end
          else
            skriv_post(dp1);
        end;
    
        if (op=0) or (nu > skiftetid) then
          skiftetid:= skiftetid + 24*60*60.0;
    
        sletsendte;
    
        if ny_fil then
        begin
          if udvid_fil then
          begin
            vt_logstart:=dp1.v_tid:= systid(dg,vt_logskift);
            dp1.v_kode:= 0;
            skriv_post(dp1);
          end
          else
          begin
            close(zvtlog,true);
            monitor(48)remove_entry:(zvtlog,0,ia);
            fil_åben:= false;
          end;
        end;
      end;
    
      disable if op<>0 and fil_åben then
      begin
        if (vt_logtail(10)//32) >= vt_logtail(1) then
        begin
          if -, udvid_fil then
          begin
            if ny_fil then
            begin
              if udvid_fil then
              begin
                systime(1,0.0,dp1.v_tid);
                vt_logstart:= dp1.v_tid;
                dp1.v_kode:= 0;
                skriv_post(dp1);
              end
              else
              begin
                close(zvtlog,true);
                monitor(48)remove_entry:(zvtlog,0,ia);
                fil_åben:= false;
              end;
            end;
          end;
        end;
    
        if fil_åben then skriv_post(dp);
      end;
    
      goto vent;
    
    vt_log_trap:
      disable skriv_vt_log(zbillede,1);
    end vt_log;
\f


algol list.off;
message coroutinemonitor - 11 ;
  

    <*************** coroutine monitor procedures ***************>


    <***** delay *****

    this procedure links the calling coroutine into the timerqueue and sets
    the timeout value to 'timeout'. *>


    procedure delay (timeout);
    value timeout;
    integer timeout;
    begin
      link(current, idlequeue);
      link(current + corutimerchain, timerqueue);
      d.current.corutimer:= timeout;


      passivate;
      d.current.corutimer:= 0;
    end;
\f


message coroutinemonitor - 12 ;


    <***** pass *****

    this procedure moves the calling coroutine from the head of the ready 
    queue down below all coroutines of lower or equal priority. *>
  
  
    procedure pass;
    begin
      linkprio(current, readyqueue);


      passivate;
    end;


    <***** signal ****

    this procedure increases the value af 'semaphore' by 1.
    in case some coroutine is already waiting, it is linked into the ready 
    queue for activation. the calling coroutine continues execution. *>
  

    procedure signal (semaphore);
    value semaphore;
    integer semaphore;
    begin
      integer array field sem;
      sem:= semaphore;
      if d.sem.simvalue < 0 then linkprio(d.sem.simcoru, readyqueue);
      d.sem.simvalue:= d.sem.simvalue + 1;


    end;
\f


message coroutinemonitor - 13 ;


    <***** wait *****

    this procedure decreases the value of 'semaphore' by 1.
    in case the value of the semaphore is negative after the decrease, the
    calling coroutine is linked into the semaphore queue waiting for a
    coroutine to signal this semaphore. *>
  
  
    procedure wait (semaphore);
    value semaphore;
    integer semaphore;
    begin
      integer array field sem;
      sem:= semaphore;
      d.sem.simvalue:= d.sem.simvalue - 1;


      linkprio(current, if d.sem.simvalue < 0 then sem+simcoru else readyqueue);
      passivate;
    end;
\f


message coroutinemonitor - 14 ;


    <***** inspect *****

    this procedure inspects the value of the semaphore and returns it in
    'elements'.
    the semaphore is left unchanged. *>


    procedure inspect (semaphore, elements);
    value semaphore;
    integer semaphore, elements;
    begin
      integer array field sem;
      sem:= semaphore;
      elements:= d.sem.simvalue;


    end;
\f


message coroutinemonitor - 15 ;


    <***** signalch *****

    this procedure delivers an operation at 'semaphore'.
    in case another coroutine is already waiting for an operation of the
    kind 'operationtype' this coroutine will get the operation and it will
    be put into the ready queue for activation.
    in case no coroutine is waiting for the actial kind of operation it is
    linked into the semaphore queue, at the end of the queue
    if operation is positive and at the beginning if operation is negative. 
    the calling coroutine continues execution. *>
  
  
    procedure signalch (semaphore, operation, operationtype);
    value semaphore, operation, operationtype;
    integer semaphore, operation;
    boolean operationtype;
    begin
      integer array field firstcoru, currcoru, op,currop;
      op:= abs  operation;
      d.op.optype:= operationtype;
      firstcoru:= semaphore + semcoru;
      currcoru:= d.firstcoru.next;
      while currcoru <> firstcoru do
      begin
        if (d.currcoru.corutypeset and operationtype) extract 12 <> 0 then
        begin
          link(operation, 0);
          d.currcoru.coruop:= operation;
          linkprio(currcoru, readyqueue);
          link(currcoru + corutimerchain, idlequeue);
          goto exit;
        end else currcoru:= d.currcoru.next;
      end;
      currop:=semaphore + semop;
      if operation < 0 then currop:=d.currop.next;
      link(op, currop);
  exit:


    end;
\f


message coroutinemonitor - 16 ;


    <***** waitch *****

    this procedure fetches an operation from a semaphore.
    in case an operation matching 'operationtypeset' is already waiting at
    'semaphore' it is handed over to the calling coroutine.
    in case no matching operation is waiting, the calling coroutine is
    linked to the semaphore.
    in any case the calling coroutine will be stopped and all corouti-
    nes are rescheduled. *>
  
  
    procedure waitch (semaphore, operation, operationtypeset, timeout);
    value semaphore, operationtypeset, timeout;
    integer semaphore, operation, timeout;
    boolean operationtypeset;
    begin
      integer array field firstop, currop;
      firstop:= semaphore + semop;
      currop:= d.firstop.next;


      while currop <> firstop do
      begin
        if (d.currop.optype and operationtypeset) extract 12 <> 0 then
        begin
          link(currop, 0);
          d.current.coruop:= currop;
          operation:= currop;
\f


message coroutinemonitor - 17 ;

          linkprio(current, readyqueue);
          passivate;
          goto exit;
        end else currop:= d.currop.next;
      end;
      linkprio(current, semaphore + semcoru);
      if timeout > 0 then
      begin
        link(current + corutimerchain, timerqueue);
        d.current.corutimer:= timeout;
      end else d.current.corutimer:= 0;
      d.current.corutypeset:= operationtypeset;
      passivate;
      if d.current.corutimer < 0 then operation:= 0
                                 else operation:= d.current.coruop;
      d.current.corutimer:= 0;
      currop:= operation;
      d.current.coruop:= currop;
      link(current+corutimerchain, idlequeue);
  exit:


    end;
\f


message coroutinemonitor - 18 ;


    <***** inspectch *****

    this procedure inspects the queue of operations waiting at 'semaphore'.
    the number of matching operations are counted and delivered in 'elements'.
if no operations are found the number of coroutines waiting
for operations of the typeset are counted and delivered as
negative value in 'elements'.
    the semaphore is left unchanged. *>
  
  
    procedure inspectch (semaphore, operationtypeset, elements);
    value semaphore, operationtypeset;
    integer semaphore, elements;
    boolean operationtypeset;
    begin
      integer array field firstop, currop,firstcoru,currcoru;
      integer counter;
      counter:= 0;
      firstop:= semaphore + semop;
      currop:= d.firstop.next;
      while currop <> firstop do
      begin
        if (operationtypeset and d.currop.optype) extract 12 <> 0 then
          counter:= counter + 1;
        currop:= d.currop.next;
      end;
      if counter=0 then
      begin
        firstcoru:=semaphore + sem_coru;
        curr_coru:=d.firstcoru.next;
        while curr_coru<>first_coru do
        begin
          if (operationtypeset and d.curr_coru.corutypeset) extract 12 <>0 then
            counter:=counter - 1;
          curr_coru:=d.curr_coru.next;
        end;
      end;
      elements:= counter;


    end;
\f


message coroutinemonitor - 19 ;


    <***** csendmessage *****

    this procedure sends the message in 'mess' to the process defined by the name
    in 'receiver', and returns an identification of the message extension used
    for sending the message (this identification is to be used for calling 'cwait-
    answer' or 'cregretmessage'. *>
  
  
    procedure csendmessage (receiver, mess, messextension);
    real array receiver;
    integer array mess;
    integer messextension;
    begin
      integer bufref, messext;
      messref(maxmessext):= 0;
      messext:= 1;
      while messref(messext) <> 0 do messext:= messext + 1;
      if messext = maxmessext then <* no resources *> messext:= 0 else
      begin
        messcode(messext):= 1 shift 12 add 2;
        mon(16) send message :(0, mess, 0, receiver);
        messref(messext):= monw2;
        if monw2 > 0 then messextension:= messext else messextension:= 0;
      end;


    end;
\f


message coroutinemonitor - 20 ;


    <***** cwaitanswer *****

    this procedure asks the coroutine monitor to get an answer to the message
    corresponding to 'messextension'. in case the answer has already arrived
    it stays in the eventqueue until 'cwaitanswer' is called.
    in case 'timeout' is positive, the coroutine is linked into the timer
    queue, and in case the answer does not arrive within 'timout' seconds the
    coroutine is restarted with result = 0. *>
  
  
    procedure cwaitanswer (messextension, answer, result, timeout);
    value messextension, timeout;
    integer messextension, result, timeout;
    integer array answer;
    begin
      integer messext;
      messext:= messextension;
      messcode(messext):= messcode(messext) extract 12;
      link(current, idlequeue);
      messop(messext):= current;
      if timeout > 0 then
      begin
        link(current + corutimerchain, timerqueue);
        d.current.corutimer:= timeout;
      end else d.current.corutimer:= 0;


      passivate;
      if d.current.corutimer < 0 then result:= 0 else
      begin
        mon(18) wait answer :(0, answer, messref(messextension), 0);
        result:= monw0;
        baseevent:= 0;
        messref(messextension):= 0;
      end;
      d.current.corutimer:= 0;
      link(current+corutimerchain, idlequeue);
    end;
\f


message coroutinemonitor - 21 ;


    <***** cwaitmessage *****

    this procedure asks the coroutine monitor to give it a message, when some-
    one arrives. in case a message has arrived already it stays at the event queue
    until 'cwaitmessage' is called.
    in case 'timeout' is positive, the coroutine is linked into the timer queue,
    if no message arrives within 'timeout' seconds, the coroutine is restarted
    with messbufferref = 0. *>
  
  
    procedure cwaitmessage (processextension, mess, messbufferref, timeout);
    value timeout, processextension;
    integer processextension, messbufferref, timeout;
    integer array mess;
    begin
      integer i;
      integer array field messbuf;
      proccode(processextension):= 2;
      procop(processextension):= current;
      link(current, idlequeue);
      if timeout > 0 then
      begin
        link(current + corutimerchain, timerqueue);
        d.current.corutimer:= timeout;
      end else d.current.corutimer:= 0;


      passivate;
      if d.current.corutimer < 0 then messbufferref:= 0 else
      begin
        messbuf:= procop(processextension);
        for i:=1 step 1 until 8 do mess(i):= core.messbuf(4+i);
        proccode(procext):= 1 shift 12;
        messbufferref:= messbuf;
        baseevent:= 0;
      end;
      d.current.corutimer:= 0;
      link(current+corutimerchain, idlequeue);
    end;
\f


message coroutinemonitor - 22 ;


    <***** cregretmessage *****

    this procedure regrets the message corresponding to messageexten-
    sion, to release message buffer and message extension.
    i/o messages are not regretable. *>

  
  
    procedure cregretmessage (messageextension);
    value messageextension;
    integer messageextension;
    begin
      integer array field messbuf;
      messbuf:= messref(messageextension);
      mon(82) regret message :(0, 0, messbuf, 0);
      messref(messageextension):= 0;


    end;
\f


message coroutinemonitor - 23 ;


    <***** semsendmessage *****

    this procedure sends the message 'mess' to 'receiver' and at the same time it
    defines a 'signalch(semaphore, operation, operationtype)' to be performed
    by the monitor, when the answer arrives.
    in case there are too few resources to send the message, the operation is
    returned immediately with the result field set to zero. *>
  
  
    procedure semsendmessage (receiver, mess, semaphore, operation, operationtype);
    value semaphore, operation, operationtype;
    real array receiver;
    integer array mess;
    integer semaphore, operation;
    boolean operationtype;
    begin
      integer array field op;
      integer messext;
      op:= operation;
      messref(maxmessext):= 0;
      messext:= 1;
      while messref(messext) <> 0 do messext:= messext + 1;
      if messext < maxmessext then
      begin
        messop(messext):= op;
        messcode(messext):=1;
        d.op(1):= semaphore;
        d.op.optype:= operationtype;
        mon(16) send message :(0, mess, 0, receiver);
        messref(messext):= monw2;
      end;


      if messext = maxmessext or messref(messext) = 0 <* no resources *> then
      begin   <* return the operation immediately with result = 0 *>
        d.op(9):= 0;
        signalch(semaphore, op, operationtype);
      end;
    end;
\f


message coroutinemonitor - 24 ;


    <***** semwaitmessage *****

    this procedure defines a 'signalch(semaphore, operation, operationtype)' to
    be performed by the coroutine monitor when a message arrives to the process
    corresponding to 'processextension'. *>
  
  
    procedure semwaitmessage (processextension, semaphore, operation, operationtype);
    value processextension, semaphore, operation, operationtype;
    integer processextension, semaphore, operation;
    boolean operationtype;
    begin
      integer array field op;
      op:= operation;
      procop(processextension):= operation;
      d.op(1):= semaphore;
      d.op.optype:= operationtype;
      proccode(processextension):= 1;


    end;
\f


message coroutinemonitor - 25 ;


    <***** semregretmessage *****

    this procedure regrets a message sent by semsendmessage.
    the message is identified by the operation in which the answer should be
    returned.
    the procedure sets the result field of the operation to zero, and then
    returns it by performing a signalch. *>
  
  
    procedure semregretmessage (operation);
    value operation;
    integer operation;
    begin
      integer i, j;
      integer array field op, sem;
      op:= operation;
      i:= 1;
      while i < maxmessext do
      begin
        if messref(i) > 0 and (messcode(i) = 1 and messop(i) = op) then
        begin
          mon(82) regret message :(0, 0, messref(i), 0);
          messref(i):= 0;
          sem:= d.op(1);
          for j:=1 step 1 until 9 do d.op(j):= 0;
          signalch(sem, op, d.op.optype);
          i:= maxmessext;
        end;
        i:= i + 1;
      end;


    end;
\f


message coroutinemonitor - 26 ;


    <***** link *****

    this procedure links an object (allocated in the descriptor array 'd') into
    a queue of alements (allocated in the descriptor array 'd'). the queues
    are all double chained, and the chainhead is of the same format as the chain
    fields of the objects.
    the procedure links the object immediately after the head. *>
  
  
    procedure link (object, chainhead);
    value object, chainhead;
    integer object, chainhead;
    begin
      integer array field prevelement, nextelement, chead, obj;
      obj:= object;
      chead:= chainhead;
      prevelement:= d.obj.prev;
      nextelement:= d.obj.next;
      d.prevelement.next:= nextelement;
      d.nextelement.prev:= prevelement;
      if chead > 0 then <* link into queue *>
      begin
        prevelement:= d.chead.prev;
        d.obj.prev:= prevelement;
        d.prevelement.next:= obj;
        d.obj.next:= chead;
        d.chead.prev:= obj;
      end else
      begin  <* link onto itself *>
        d.obj.prev:= obj;
        d.obj.next:= obj;
      end;
    end;
\f


message coroutinemonitor - 27 ;


    <***** linkprio *****

    this procedure is used to link coroutines into queues corresponding to
    the priorities of the actual coroutine and the queue elements.
    the object is linked immediately before the first coroutine of lower prio-
    rity. *>
  
  
    procedure linkprio (object, chainhead);
    value object, chainhead;
    integer object, chainhead;
    begin
      integer array field currelement, chead, obj;
      obj:= object;
      chead:= chainhead;
      currelement:= d.chead.next;
      while currelement <> chead
            and d.currelement.corupriority <= d.obj.corupriority 
              do currelement:= d.currelement.next;
      link(obj, currelement);
    end;
\f


message coroutinemonitor - 28 ;

\f


message coroutinemonitor - 30a ;


    <*************** extention to coroutine monitor procedures **********>

    <***** signalbin *****

    this procedure simulates a binary semaphore on a simple semaphore
    by testing the value of the semaphore before signaling the
    semaphore. if the value of the semaphore is one (=open) nothing is
    done, otherwise a normal signal is carried out. *>


    procedure signalbin(semaphore);
    value semaphore;
    integer semaphore;
    begin
      integer array field sem;
      integer val;
      sem:= semaphore;
      inspect(sem,val);
      if val<1 then signal(sem);
    end;
\f


message coroutinemonitor - 30b ;

  <***** coruno *****

  delivers the coroutinenumber for a give coroutine id.
  if the coroutine does not exists the value 0 is delivered *>

  integer procedure coru_no(coru_id);
  value                     coru_id;
  integer                   coru_id;
  begin
    integer array field cor;

    coru_no:= 0;
    for cor:= firstcoru step corusize until (coruref-1) do
      if d.cor.coruident//1000 = coru_id then
      coru_no:= d.cor.coruident mod 1000;
  end;
\f


message coroutinemonitor - 30c ;

  <***** coroutine *****

  delivers the referencebyte for the coroutinedescriptor for
  a coroutine identified by coroutinenumber *>

  integer procedure coroutine(cor_no);
    value                     cor_no;
    integer                   cor_no;
  coroutine:= if cor_no <= 0 or maxcoru < cor_no then -1 else
              firstcoru + (cor_no-1)*corusize;
\f


message coroutinemonitor - 30d ;

<***** curr_coruno *****

delivers number of calling coroutine 
    curr_coruno:
        < 0     = -current_coroutine_number in disabled mode
        = 0     = procedure not called from coroutine
        > 0     = current_coroutine_number in enabled mode   *>

integer procedure curr_coruno;
begin
  integer i;
  integer array ia(1:12);

  i:= system(12,0,ia);
  if i > 0 then
  begin
    i:= system(12,1,ia);
    curr_coruno:= ia(3);
  end else curr_coruno:= 0;
end curr_coruno;
\f


message coroutinemonitor - 30e ;

<***** curr_coruid *****

delivers coruident of calling coroutine :

    curr_coruid:
        > 0     = coruident of calling coroutine
        = 0     = procedure not called from coroutine  *>

integer procedure curr_coruid;
begin
  integer cor_no;
  integer array field cor;

  cor_no:= abs curr_coruno;
  if cor_no <> 0 then
  begin
    cor:= coroutine(cor_no);
    curr_coruid:= d.cor.coruident // 1000;
  end
  else curr_coruid:= 0;
end curr_coruid;
\f

message coroutinemonitor - 30f.1 ;

    <**** getch *****

    this procedure searches the queue of operations waiting at 'semaphore'
    to find an operation that matches the operationstypeset and a set of
    select-values. each select value is specified by type and fieldvalue
    in integer array 'type' and by the value in integer array 'val'.

0: eq  0:   not used
1: lt  1:   boolean
2: le  2:   integer
3: gt  3:   long
4: ge  4:   real
5: ne
*>

    procedure getch(semaphore,operation,operationtypeset,type,val);
    value semaphore,operationtypeset;
    integer semaphore,operation;
    boolean operationtypeset;
    integer array type,val;
    begin
      integer array field firstop,currop;
      integer ø,n,i,f,t,rel,i1,i2;
      boolean field bf,bfval;
      integer field intf;
      long field lf,lfval; long l1,l2;
      real field rf,rfval; real r1,r2;
  
      boolean match;

      operation:= 0;
      n:= system(3,ø,type);
      match:= false;
      firstop:= semaphore + semop;
      currop:= d.firstop.next;
      while currop <> firstop and -,match do
      begin
        if (operationtypeset and d.currop.optype) extract 12 <> 0 then
        begin
          i:= n;
          match:= true;
\f

message coroutinemonitor - 30f.2 ;

          while match and (if i <= ø then type(i) >= 0 else false) do
          begin
            rel:= type(i) shift(-18);
            t:= type(i) shift(-12) extract 6;
            f:= type(i) extract 12;
            if f > 2047 then f:= f -4096;
            case t+1 of
            begin
              ; <* not used *>

              begin <*boolean or signed short integer*>
                bf:= f;
                bfval:= 2*i;
                i1:= d.currop.bf extract 12;
                if i1 > 2047 then i1:= i1-4096;
                i2:= val.bfval extract 12;
                if i2 > 2047 then i2:= i2-4096;
                match:= case rel+1 of (i1=i2,i1<i2,i1<=i2,i1>i2,i1>=i2,i1<>i2);
              end;

              begin <*integer*>
                intf:= f;
                i1:= d.currop.intf;
                i2:= val(i);
                match:= case rel+1 of (i1=i2,i1<i2,i1<=i2,i1>i2,i1>=i2,i1<>i2);
              end;

              begin <*long*>
                lf:= f;
                lfval:= i*2;
                l1:= d.currop.lf;
                l2:= val.lfval;
                match:= case rel+1 of (l1=l2,l1<l2,l1<=l2,l1>l2,l1>=l2,l1<>l2);
              end;

              begin <*real*>
                rf:= f;
                rfval:= i*2;
                r1:= d.currop.rf;
                r2:= val.rfval;
                match:= case rel+1 of (r1=r2,r1<r2,r1<=r2,r1>r2,r1>=r2,r1<>r2);
              end;

            end;<*case t+1*>

            i:= i+1;
          end; <*while match and i<=ø and t>=0 *>
\f

message coroutinemonitor - 30f.3 ;

        end; <* if operationtypeset and ---*>
        if -,match then currop:= d.currop.next;
      end; <*while currop <> firstop and -,match*>

      if match then
      begin
        link(currop,0);
        d.current.coruop:= currop;
        operation:= currop;
      end;
    end getch;
\f


message coroutinemonitor - 31 ;

    activity(maxcoru);

    goto initialization;



    <*************** event handling ***************>


  
  takeexternal:
    currevent:= baseevent;
    eventqueueempty:= false;
    repeat
      current:= 0;
      prevevent:= currevent;
      mon(66) test event :(0, 0, currevent, 0);
      currevent:= monw2;
      if monw0 < 0 <* no event *> then goto takeinternal;
      if monw0 = 1 and monw1 > 0 and monw1 <= maxcoru then
        cmi:= monw1
      else
        cmi:= - monw0;

      if cmi > 0 then
        begin <* answer to activity zone *>
          current:= firstcoru + (cmi - 1) * corusize;
          linkprio(current, readyqueue);
          baseevent:= 0;
        end else
  
      if cmi = 0 then
        begin <* message arrived *>
\f


message coroutinemonitor - 32 ;

          receiver:= core.currevent(3);
          if receiver < 0 then receiver:= - receiver;
          procref(maxprocext):= receiver;
          procext:= 1;
          while procref(procext) <> receiver do procext:= procext + 1;
          if procext = maxprocext then
          begin <* receiver unknown *>
            <* leave the message unchanged *>
          end else
          if proccode(procext) shift (-12) = 0 then
          begin  <* the receiver is ready for accepting messages *>
            mon(26) get event :(0, 0, currevent, 0);
            case proccode(procext) of
            begin
              begin <* message received by semwaitmessage *>
                op:= procop(procext);
                sem:= d.op(1);
                for cmj:=1 step 1 until 8 do d.op(cmj):= core.currevent(4+cmj);
                d.op(9):= currevent;
                signalch(sem, op, d.op.optype);
                proccode(procext):= 1 shift 12;
              end;
              begin <* message received by cwaitmessage *>
                current:= procop(procext);
                procop(procext):= currevent;
                linkprio(current, readyqueue);
                link(current + corutimerchain, idlequeue);


              end;
            end; <* case *>
            currevent:= baseevent;
            proccode(procext):= 1 shift 12;
          end;
        end <* message *> else
  
      if cmi = -1 then
        begin  <* answer arrived *>
\f


message coroutinemonitor - 33 ;

          if currevent = timermessage then
          begin
            mon(26) get event :(0, 0, currevent, 0);
            coru:= d.timerqueue.next;
            while coru <> timerqueue do
            begin
              current:= coru - corutimerchain;
              d.current.corutimer:= d.current.corutimer - clockmess(2);
              coru:= d.coru.next;
              if d.current.corutimer <= 0 then
              begin <* timer perion expired *>
                d.current.corutimer:= -1;
                linkprio(current, readyqueue);
                link(current + corutimerchain, idlequeue);
              end;
            end;
            mon(16) send message :(0, clockmess, 0, clock);
            timermessage:= monw2;
            currevent:= baseevent;
          end <* timer answer *> else
          begin
            messref(maxmessext):= currevent;
            messext:= 1;
            while messref(messext) <> currevent do messext:= messext + 1;
            if messext = maxmessext then
            begin <* the answer is unknown *>
              <* leave the answer unchanged - it may belong to an activity *>
            end else
            if messcode(messext) shift (-12) = 0 then
            begin
              case messcode(messext) extract 12 of
              begin
\f


message coroutinemonitor - 34 ;
                begin <* answer arrived after semsendmessage *>
                  op:= messop(messext);
                  sem:= d.op(1);
                  mon(18) wait answer :(0, d.op, currevent, 0);
                  d.op(9):= monw0;
                  signalch(sem, op, d.op.optype);
                  messref(messext):= 0;
                  baseevent:= 0;
                end;
                begin <* answer arrived after csendmessage *>
                  current:= messop(messext);
                  linkprio(current, readyqueue);
                  link(current + corutimerchain, idlequeue);


                end;
              end;
            end else baseevent:= currevent;
          end;
        end;
    until eventqueueempty;
\f


message coroutinemonitor - 35 ;



    <*************** coroutine activation ***************>

takeinternal:
  
    current:= d.readyqueue.next;
    if current = readyqueue then
    begin
      mon(24) wait event :(0, 0, prevevent, 0);
      goto takeexternal;
    end;

<*+2*> if testbit30 and d.current.corutestmask shift(-11) then
<**>   begin
<**>     systime(5,0,r);
<**>     write(out,"nl",1,<<zd dd dd>,r,<: coroutine: :>,<<dd>,
<**>       d.current.coruident mod 1000,<:  ident: :>,<<ddd>,
<**>       d.current.coruident//1000,<: aktiveres:>);
<**>   end;
<*-2*>

    corustate:= activate(d.current.coruident mod 1000);
    cmi:= corustate extract 24;
<*+2*> if testbit30 and d.current.corutestmask shift(-11) then
<**>   begin
<**>     systime(5,0,r);
<**>     write(out,"nl",1,<<zd dd dd>,r,<: coroutine: :>,<<dd>,
<**>       d.current.coruident mod 1000,<:  ident: :>,<<ddd>,
<**>       d.current.coruident//1000,<: afbrudt, årsag=:>,cmi);
<**>   end;
<*-2*>

    if cmi = 1 then
    begin  <* programmed passivate *>
      goto takeexternal;
    end;

    if cmi = 2 then
    begin <* implicit passivate in activity *>


      link(current, idlequeue);
      goto takeexternal;
    end;
\f


message coroutinemonitor - 36 ;

    <* coroutine termination (normal or abnormal) *>

<* aktioner ved normal og unormal coroutineterminering insættes her *>
coru_term:

    begin
      if false and alarmcause extract 24 = (-9) <* break *> and
         alarmcause shift (-24) extract 24 = 0 then
      begin
        endaction:= 2;
        goto program_slut;
      end;
      if alarmcause extract 24 = (-9) <* break *> and
         alarmcause shift (-24) = 8 <* parent *>
      then sæt_bit_i(trapmode,15<*killed activities*>,0<*normal output*>);
      if alarmcause shift (-24) extract  24 <> -2 or
         alarmcause extract 24 <> -13 then
      begin
        write(zbillede,"nl",1,<:alarmcause(param,cause)=:>,<<d>,
              alarmcause shift (-24),<:,:>,
              alarmcause extract 24);
        for i:=1 step 1 until max_coru do
          j:=activate(-i); <* kill *>
<*      skriv billede *>
      end
      else
      begin
        errorbits:= 0; <* ok.yes warning.no *>
        goto finale;
      end;
    end;

goto dump;

    link(current, idlequeue);
    goto takeexternal;
\f


message coroutinemonitor - 37 ;



  initialization:


    <*************** initialization ***************>
  
    <* chain head *>
  
       prev:= -2;                         <* -2  prev *>
       next:= 0;                          <* +0  next *>
  
    <* corutine descriptor *>
  
                                          <* -2  prev *>
                                          <* +0  next *>
                                          <* +2  (link field) *>
       corutimerchain:= next + 4;         <* +4  corutimerchain *>
                                          <* +6  (link field) *>
       coruop:= corutimerchain + 4;       <* +8  coruop *>
       corutimer:= coruop + 2;            <*+10  corutimer *>
       coruident:= corutimer + 2;         <*+12  coruident *>
       corupriority:= coruident + 2;      <*+14  corupriority *>
       corutypeset:= corupriority + 1;    <*+15  corutypeset *>
       corutestmask:= corutypeset + 1;    <*+16  corutestmask *>
  
    <* simple semaphore *>
  
                                          <* -2  (link field) *>
       simcoru:= next;                    <* +0  simcoru *>
       simvalue:= simcoru + 2;            <* +2  simvalue *>
  
    <* chained semaphore *>
  
                                          <* -2  (link field) *>
       semcoru:= next;                    <* +0  semcoru *>
                                          <* +2  (link field) *>
       semop:= semcoru + 4;               <* +4  semop *>
\f


message coroutinemonitor - 38 ;
  
    <* operation *>
  
       opsize:= next - 6;                 <* -6  opsize *>
       optype:= opsize + 1;               <* -5  optype *>
                                          <* -2  prev *>
                                          <* +0  next *>
                                          <* +2  operation(1) *>
                                          <* +4  operation(2) *>
                                          <* +6      -        *>
                                          <*  .      -        *>
                                          <*  .      -        *>
  
\f


message coroutinemonitor - 39 ;
  
      trap(dump);
      systime(1, 0, starttime);
      for cmi:= 1 step 1 until maxmessext do messref(cmi):= 0;
      clockmess(1):= 0;
      clockmess(2):= timeinterval;  
      clock(1):= real <:clock:>;
      clock(2):= real <::>;
      mon(16) send message :(0, clockmess, 0, clock);
      timermessage:= monw2;
      readyqueue:= 4;
      initchain(readyqueue);
      idlequeue:= readyqueue + 4;
      initchain(idlequeue);
      timerqueue:= idlequeue + 4;
      initchain(timerqueue);
      current:= 0;
      corucount:= 0;
      proccount:= 0;
      baseevent:= 0;
      coruref:= timerqueue + 4;
      firstcoru:= coruref;
      simref:= coruref + maxcoru * corusize;
      firstsim:= simref;
      semref:= simref + maxsem * simsize;
      firstsem:= semref;
      opref:= semref + maxsemch * semsize + 4;
      firstop:= opref;
      optop:= opref + maxop * opheadsize + maxnettoop - 6;
      for cmi:= coruref step 2 until optop - 2 do d(cmi/2):= 0;
      reflectcore(core);

algol list.on;
  
      \f

      message sys_initialisering side 1 - 810601/hko;
      
        trapmode:= 1 shift 15;
        errorbits:= 1; <* warning.no ok.no *>
        trap(coru_term);
      
        open(zbillede,4,<:billede:>,0);
        write(zbillede,"ff",1,"nl",2,<:********** billede for kørsel startet :>,
              <<zddddd>,systime(5,0,r),".",1,r,<: **********:>,"nl",1);
        system(2,0,ia);
        open(zdummy,4,ia,0); close(zdummy,false);
        monitor(42,zdummy,0,ia);
        laf:= 0;
        write(zbillede,"nl",1,<:prog.vers.  :>,<<dddddd.dddd>,
          systime(6,ia(6),r)+r/1000000,"nl",2,
          <:konsolnavn: :>,konsol_navn.laf,"nl",1);
      
        open(zrl,4,<:radiolog:>,0);
        if monitor(42)lookup_entry:(zrl,0,ia)<>0 or
           monitor(52)create_areaproc:(zrl,0,ia)<>0 or
           monitor(8)reserve_process:(zrl,0,ia)<>0 then
        begin
          ia(1):=1; ia(2):= 3;
          for i:= 3 step 1 until 10 do ia(i):= 0;
          monitor(40)create_area:(zrl,0,ia);
        end;
      
        for i:=1 step 1 until max_antal_fejltekster do
          fejltekst(i):= real (case i of (
      <* 1*><:filsystem:>,
      <* 2*><:operationskode:>,
      <* 3*><:programfejl:>,
      <* 4*><:monitor<'_'>resultat=:>,
      <* 5*><:læs<'_'>fil:>,
      <* 6*><:skriv<'_'>fil:>,
      <* 7*><:modif<'_'>fil:>,
      <* 8*><:hent<'_'>fil<'_'>dim:>,
      <* 9*><:sæt<'_'>fil<'_'>dim:>,
      <*10*><:vogntabel:>,
      <*11*><:fremmed operation:>,
      <*12*><:operationstype:>,
      <*13*><:opret<'_'>fil:>,
      <*14*><:tilknyt<'_'>fil:>,
      <*15*><:frigiv<'_'>fil:>,
      <*16*><:slet<'_'>fil:>,
      <*17*><:ydre enhed, status=:>,
      <*18*><:tabelfil:>,
      <*19*><:radio:>,
      <*20*><:mobilopkald, bus:>,
      <*21*><:talevejsswitch:>,
      <*99*><:ftslut:>));
      
      for i:= 1 step 1 until max_antal_områder do
      begin
        område_navn(i):= long (case i of
          (<:TLF:>,<:VHF:>,<:KBH:>,<:RO:>,<:FS:>,<:HHL:>,<:GLX:>,
           <:KJ:>,<:HI:>,<:HG:>,<:BA:>) ); 
        område_id(i,1):= område_navn(i) shift (-24) extract 24;
        område_id(i,2):= 
          (case i of ( 2,  3, 13,  3,  3,  3,  3,  3,  3,  3,  3)) shift 6 add
          (case i of ( 2,  5,  2,  9, 10, 11, 12, 13, 14, 15, 16));
      end;
      
      pabx_id(1):= -1;
      pabx_id(2):= 1;
      
      for i:= 1 step 1 until max_antal_radiokanaler do
      begin
        radio_id(i):= 
          case i of ( 3, 3, 3, 3, 2, -1, -1, -1, 4, 5, 6, 7, 8, 9, 10, 11);
      end;
      
      for i:=1 step 1 until max_antal_kanaler do
      begin
        kanal_navn(i):= long (case i of (
          <:K1:>,<:K2:>,<:K3:>,<:K4:>,<:K5:>,<:K9:>,<:K10:>,<:K11:>,<:K12:>,
          <:K13:>,<:K14:>,<:K15:>,<:K16:>,<:L4190:>) );
        kanal_id(i):= 
          (case i of ( 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2)) shift 5 +
          (case i of ( 2, 3, 4, 1, 5, 9,10,11,12,13,14,15,16, 2));
      end;
      
      for i:= 1 step 1 until op_maske_lgd//2 do
        ingen_operatører(i):= alle_operatører(i):= 0;
      for i:= 1 step 1 until tv_maske_lgd//2 do
        ingen_taleveje(i):= alle_taleveje(i):= 0;
      
      begin
        long array navn(1:2);
        long array field doc, ref;
      
        doc:= 2; iaf:= 0;
        movestring(navn,1,<:terminal0:>);
        for i:= 1 step 1 until max_antal_operatører do
        begin
          ref:=(i-1)*8; k:=9;
          if i>9 then skrivtegn(navn.iaf, k, '0' + i//10);
          skrivtegn(navn.iaf,k,'0'+ i mod 10);
          open(zdummy,8,navn,0); close(zdummy,true);
          k:= monitor(42,zdummy,0,ia);
          if k=0 then tofrom(terminal_navn.ref,ia.doc,8)
          else tofrom(terminal_navn.ref,navn,8);
          operatør_auto_include(i):= false;
          sætbit_ia(alle_operatører,i,1);
        end;
      
        movestring(navn,1,<:garage0:>);
        for i:= 1 step 1 until max_antal_garageterminaler do
        begin
          ref:=(i-1)*8; k:=7;
          if i>9 then skrivtegn(navn.iaf, k, '0' + i//10);
          skrivtegn(navn.iaf,k,'0'+ i mod 10);
          open(zdummy,8,navn,0); close(zdummy,true);
          k:= monitor(42,zdummy,0,ia);
          if k=0 then tofrom(garage_terminal_navn.ref,ia.doc,8)
          else tofrom(garage_terminal_navn.ref,navn,8);
          garage_auto_include(i):= false;
        end;
      end;
      
      for i:= 1 step 1 until max_antal_taleveje do
        sætbit_ia(alle_taleveje,i,1);
      for i:= 1 step 1 until findfpparam(<:operatør:>,true,ia) do
        if 1<=ia(i) and ia(i)<=max_antal_operatører then
          operatør_auto_include(ia(i)):= true;
      for i:= 1 step 1 until findfpparam(<:garage:>,true,ia) do
        if 1<=ia(i) and ia(i)<=max_antal_garageterminaler then
          garage_auto_include(ia(i)):= true;
      
      
      \f

      message fil_init side 1 - 801030/jg;
      
      begin integer i,antz,tz,s;
            real array field raf;
      
      filskrevet:=fillæst:=0;                                    <*fil*>
      dbsegmax:= 2**18-1;
      
      tz:=dbantez+dbantsz; antz:=tz+dbanttz;
      for i:=1 step 1 until dbantez do
        begin open(fil(i),4,<::>,0); close(fil(i),false) end;
      for i:=dbantez+1 step 1 until tz do
        open(fil(i),4,dbsnavn,0);
      for i:=tz+1 step 1 until antz do
        open(fil(i),4,dbtnavn,0);
      
      for i:=1 step 1 until dbantez do                        <*dbkatz*>
        dbkatz(i,1):=dbkatz(i,2):=0;
      for i:=dbantez+1 step 1 until tz do
        begin dbkatz(i,1):=2 shift 10;dbkatz(i,2):=0 end;
      for i:=tz+1 step 1 until antz do
        begin dbkatz(i,1):=1 shift 10;dbkatz(i,2):=i+1 end;
      dbkatz(antz,2):=tz+1;
      dbsidstetz:=antz;
      dbsidstesz:=tz;
      
      for i:=1 step 1 until dbmaxef do                        <*dbkate*>
        begin integer j;
          for j:=1,3 step 1 until 6 do
            dbkate(i,j):=0;
          dbkate(i,2):=i+1;
        end;
      dbkate(dbmaxef,2):=0;
      dbkatefri:=1;
      dbantef:=0;
      \f

      message fil_init side 2 - 801030/jg;
      
      
      for i:= 1 step 1 until dbmaxsf do                       <*dbkats*>
        begin
          dbkats(i,1):=0;
          dbkats(i,2):=i+1;
        end;
      dbkats(dbmaxsf,2):=0;
      dbkatsfri:=1;
      dbantsf:=0;
      
      for i:=1 step 1 until dbmaxb do                         <*dbkatb*>
        dbkatb(i):=false add (i+1);
      dbkatb(dbmaxb):=false;
      dbkatbfri:=1;
      dbantb:=0;
      raf:=4;
      for i:=1 step 1 until dbmaxtf do
        begin
          inrec6(fil(antz),4);
          dbkatt.raf(i):=fil(antz,1);
        end;
      inrec6(fil(antz),4);
      if fil(antz,1)<>real extend 8388607 shift 24 add 8388607 then
        fejl_reaktion(1,dbmaxtf,<:tabelfil init:>,0);
      setposition(fil(antz),0,0);
      
      end filsystem;
      \f

      message fil_init side 3 - 810209/cl;
      
      bs_kats_fri:= nextsem;
      <*+3*> skriv_new_sem(out,1,bs_kats_fri,<:bs-kats-fri:>);
      <*-3*>
      bs_kate_fri:= nextsem;
      <*+3*> skriv_new_sem(out,1,bs_kate_fri,<:bs-kate-fri:>);
      <*-3*>
      cs_opret_fil:= nextsemch;
      <*+3*> skriv_new_sem(out,3,cs_opret_fil,<:cs-opret-fil:>);
      <*-3*>
      cs_tilknyt_fil:= nextsemch;
      <*+3*> skriv_new_sem(out,3,cs_tilknyt_fil,<:cs-tilknyt-fil:>);
      <*-3*>
      cs_frigiv_fil:= nextsemch;
      <*+3*> skriv_new_sem(out,3,cs_frigiv_fil,<:cs-frigiv-fil:>);
      <*-3*>
      cs_slet_fil:= nextsemch;
      <*+3*> skriv_new_sem(out,3,cs_slet_fil,<:cs-slet-fil:>);
      <*-3*>
      cs_opret_spoolfil:= nextsemch;
      <*+3*> skriv_new_sem(out,3,cs_opret_spoolfil,<:cs-opret-spoolfil:>);
      <*-3*>
      cs_opret_eksternfil:= nextsemch;
      <*+3*> skriv_new_sem(out,3,cs_opret_eksternfil,<:cs-opret-ekst-fil:>);
      <*-3*>
      \f

      message fil_init side 4 810209/cl;
      
      
      <* initialisering af filsystemcoroutiner *>
      
      i:= nextcoru(001,10,true);
      j:= newactivity(i,0,opretfil);
      <*+3*> skriv_newactivity(out,i,j);
      <*-3*>
      
      i:= nextcoru(002,10,true);
      j:= newactivity(i,0,tilknytfil);
      <*+3*> skriv_newactivity(out,i,j);
      <*-3*>
      
      i:= nextcoru(003,10,true);
      j:= newactivity(i,0,frigivfil);
      <*+3*> skriv_newactivity(out,i,j);
      <*-3*>
      
      i:= nextcoru(004,10,true);
      j:= newactivity(i,0,sletfil);
      <*+3*> skriv_newactivity(out,i,j);
      <*-3*>
      
      i:= nextcoru(005,10,true);
      j:= newactivity(i,0,opretspoolfil);
      <*+3*> skriv_newactivity(out,i,j);
      <*-3*>
      
      i:= nextcoru(006,10,true);
      j:= newactivity(i,0,opreteksternfil);
      <*+3*> skriv_newactivity(out,i,j);
      <*-3*>
      \f

      message attention_initialisering side 1 - 850820/cl;
      
        tf_kommandotabel:= 1 shift 10 + 1;
      
        begin
          integer i, s, zno;
          zone z(128,1,stderror);
          integer array fdim(1:8);
      
          fdim(4):= tf_kommandotabel;
          hentfildim(fdim);
      
          open(z,4,<:htkommando:>,0);
          for i:= 1 step 1 until fdim(3) do
          begin
            inrec6(z,512);
            s:= skrivfil(tf_kommandotabel,i,zno);
            if s<>0 then fejlreaktion(6,s,<:kommandotabelinit:>,0);
            tofrom(fil(zno),z,512);
          end;
          close(z,true);
        end;
      \f

      message attention_initialisering side 1a - 810428/hko;
      
        for j:= system(3,i,terminal_tab) step 1 until i do
          terminal_tab(j):= 0;
      
        cs_att_pulje:=next_semch;
      <*+3*> skriv_new_sem(out,3,cs_att_pulje,<:cs-att-pulje:>);
      <*-3*>
      
        bs_fortsæt_adgang:= nextsem;
      <*+3*> skriv_new_sem(out,1,bs_fortsæt_adgang,<:bs-fortsæt-adgang:>);
      <*-3*>
        signalbin(bs_fortsæt_adgang);
      
        for i:= 1,
            1 step 1 until max_antal_operatører,
            1 step 1 until max_antal_garageterminaler do
      
        <* initialisering af pulje med attention_operationer *>
      
          signalch(cs_att_pulje,    <* pulje_semafor   *>
                   nextop(data+att_op_længde), <* næste_operation *>
                   gen_optype);
      
        att_proc_ref:=next_proc_ext(system(6<* own process*>,i,ra));
      
        i:=next_coru(010,<*ident*>
                       2,<*prioritet*>
                     true<*test_maske*>);
        j:=newactivity(        i, <*activityno     *>
                               0, <*ikke virtual   *>
                       attention);<*ingen parametre*>
      
      <*+3*>skriv_newactivity(out,i,j);
      <*-3*>
      
      \f

      message io_initialisering side 1 - 810507/hko;
      
        io_spoolfil:= 1028;
        begin
          integer array fdim(1:8);
          fdim(4):= io_spoolfil;
          hent_fildim(fdim);
          io_spool_postantal:= fdim(1);
          io_spool_postlængde:= fdim(2);
        end;
      
        io_spool_post:= 4;
      
          cs_io:= next_semch;
      <*+3*> skriv_new_sem(out,3,cs_io,<:cs-io:>);
      <*-3*>
      
          i:= next_coru(100,<*ident *>
                         5,<*prioritet *>
                        true<*test_maske*>);
      
          j:= new_activity(   i,
                              0,
                           h_io);
      
      <*+3*>skriv_newactivity(out,i,j);
      <*-3*>
        cs_io_komm:= next_semch;
      <*+3*> skriv_new_sem(out,3,cs_io_komm,<:cs-io-komm:>);
      <*-3*>
      
        i:= next_coru(101,<*ident*>
                       10,<*prioritet*>
                     true <*testmaske*>);
        j:= new_activity(          i,
                                   0,
                         io_komm);<*ingen parametre*>
      
      <*+3*>skriv_newactivity(out,i,j);
      <*-3*>
      \f

      message io_initialisering side 2 - 810520/hko/cl;
      
        bs_zio_adgang:= next_sem;
      <*+3*> skriv_new_sem(out,1,bs_zio_adgang,<:bs-zio-adgang:>);
      <*-3*>
        signal_bin(bs_zio_adgang);
      
        cs_io_spool:= next_semch;
      <*+3*> skriv_new_sem(out,3,cs_io_spool,<:cs-io-spool:>);
      <*-3*>
      
        cs_io_fil:=next_semch;
      <*+3*> skriv_new_sem(out,3,cs_io_fil,<:cs-io-fil:>);
      <*-3*>
        signal_ch(cs_io_fil,next_op(data+18),gen_optype);
      
        ss_io_spool_fulde:= next_sem;
      <*+3*> skriv_new_sem(out,2,ss_io_spool_fulde,<:ss-io-spool-fulde:>);
      <*-3*>
      
        ss_io_spool_tomme:= next_sem;
      <*+3*> skriv_new_sem(out,2,ss_io_spool_tomme,<:ss-io-spool-tomme:>);
      <*-3*>
        for i:= 1 step 1 until io_spool_postantal do
          signal(ss_io_spool_tomme);
      \f

      message io_initialisering side 3 - 880901/cl;
      
        i:= next_coru(102,
                       5,
                      true);
        j:= new_activity(i,0,io_spool);
      
      <*+3*>skriv_newactivity(out,i,j);
      <*-3*>
      
        i:= next_coru(103,
                       10,
                      true);
        j:= new_activity(i,0,io_spon);
      
      <*+3*>skriv_newactivity(out,i,j);
      <*-3*>
      
          cs_io_medd:= next_semch;
      <*+3*> skriv_new_sem(out,3,cs_io_medd,<:cs-io-medd:>);
      <*-3*>
      
          i:= next_coru(104,<*ident *>
                        10,<*prioritet *>
                        true<*test_maske*>);
      
          j:= new_activity(   i,
                              0,
                        io_medd);
      
      <*+3*>skriv_newactivity(out,i,j);
      <*-3*>
      
          cs_io_nulstil:= next_semch;
      <*+3*> skriv_new_sem(out,3,cs_io_nulstil,<:cs-io-nulstil:>);
      <*-3*>
      
          i:= next_coru(105,<*ident *>
                        10,<*prioritet *>
                        true<*test_maske*>);
      
          j:= new_activity(   i,
                              0,
                        io_nulstil_tællere);
      
      <*+3*>skriv_newactivity(out,i,j);
      <*-3*>
      
        open(z_io,8,konsol_navn,1 shift 21 + 1 shift 9);
        i:= monitor(8)reserve process:(z_io,0,ia);
        if i <> 0 then
        begin
          fejlreaktion(4<*monitor result*>,+i,<:io reservation:>,0);
        end
        else
        begin
          ref:= 0;
          terminal_tab.ref.terminal_tilstand:= 0;
          write(z_io,"nl",3,"sp",10,"*",15,<: busradio startet :>,
                  <<zddddd>,systime(5,0.0,r),".",1,r,
                  "sp",1,"*",15,"nl",1);
          setposition(z_io,0,0);
        end;
      \f

      message operatør_initialisering side 1 - 810520/hko;
      
        top_bpl_gruppe:= 64;
        
        bpl_navn(0):= long<::>;
        for i:= 1 step 1 until 127 do
        begin
          k:= læsfil(tf_bpl_navne,i,j);
          if k<>0 then fejlreaktion(5,k,<:bplnavne init:>,0);
          bpl_navn(i):= (long fil(j,1)) shift (-8) shift 8;
          if i<=max_antal_operatører then
            operatør_auto_include(i):= false add (fil(j,1) extract 8);
          if i>64 and fil(j,1)<>real<::> and i>top_bpl_gruppe then
            top_bpl_gruppe:= i;
        end;
      
        for i:= 0 step 1 until 64 do
        begin
          iaf:= i*op_maske_lgd;
          tofrom(bpl_def.iaf,ingen_operatører,op_maske_lgd);
          bpl_tilst(i,1):= bpl_tilst(i,2):= 0;
          if 1<=i and i<= max_antal_operatører then
          begin
            bpl_tilst(i,2):= 1;
            sætbit_ia(bpl_def.iaf,i,1);
          end;
        end;
        for i:= 65 step 1 until 127 do
        begin
          k:= læsfil(tf_bpl_def,i-64,j);
          if k<>0 then fejlreaktion(5,k,<:bpldef init:>,0);
          iaf:= i*op_maske_lgd;
          tofrom(bpl_def.iaf,fil(j),op_maske_lgd);
          bpl_tilst(i,1):= 0;
          bpl_tilst(i,2):= fil(j,2) extract 24;
        end;
      
        for k:= 0,1,2,3 do operatør_stop(0,k):= 0;
        iaf:= 0;
        for i:= 1 step 1 until max_antal_operatører do
        begin
          k:= læsfil(tf_stoptabel,i,j);
          if k<>0 then fejlreaktion(5,k,<:stoptabel init:>,0);
          operatør_stop(i,0):= i;
          for k:= 1,2,3 do
            operatør_stop(i,k):= fil(j).iaf(k+1);
          ant_i_opkø(i):= 0;
        end;
      
        tofrom(operatørmaske,ingen_operatører,op_maske_lgd);
        for i:= 0 step 1 until max_antal_operatører do op_talevej(i):= 0;
        for i:= 0 step 1 until max_antal_taleveje do tv_operatør(i):= 0;
        sidste_tv_brugt:= max_antal_taleveje;
      
        for i:= 1 step 1 until max_antal_operatører*(opk_alarm_tab_lgd//2) do
          opk_alarm(i):= 0;
        for i:= 1 step 1 until max_antal_operatører do
        begin
          integer array field tab;
      
          k:= læsfil(tf_alarmlgd,i,j);
          if k<>0 then fejlreaktion(5,k,<:alarmlængde init:>,0);
          tab:= (i-1)*opk_alarm_tab_lgd;
          opk_alarm.tab.alarm_lgd:= fil(j).iaf(1);
          opk_alarm.tab.alarm_start:= 0.0;
        end;
      
        op_spool_kilde:= 2;
        op_spool_tid  := 6;
        op_spool_text := 6;
        begin
          long array field laf1, laf2;
          laf2:= 4; laf1:= 0;
          op_spool_buf.laf1(1):= long<::>;
          tofrom(op_spool_buf.laf2,op_spool_buf.laf1,
            op_spool_postantal*op_spool_postlgd-4);
        end;
      
        k:=læsfil(1033,1,j);
        systime(1,0.0,r);
        if k<>0 then fejlreaktion(5,k,<:CQF-tabel init:>,0);
        for i:= 1 step 1 until max_cqf do
        begin
          ref:= (i-1)*cqf_lgd; iaf:= (i-1)*8;
          tofrom(cqf_tabel.ref,fil(j).iaf,8);
          cqf_tabel.ref.cqf_næste_tid:= 
            (if cqf_tabel.ref.cqf_bus > 0 then (r + 5*60.0) else real<::>);
          cqf_tabel.ref.cqf_ok_tid:= real<::>;
        end;
        op_cqf_tab_ændret:= true;
      
        laf:= raf:= 0;
        open(z_tv_in,8,taleswitch_in_navn,1 shift 21 + 1 shift 9);
        i:= monitor(8)reserve_process:(z_tv_in,0,ia);
        j:= 1;
        if i<>0 then 
          fejlreaktion(4,i,string taleswitch_in_navn.raf(increase(j)),1);
        open(z_tv_out,4 shift 12 + 8,taleswitch_out_navn,1 shift 9);
        i:= monitor(8)reserve_process:(z_tv_in,0,ia);
        j:= 1;
        if i<>0 then 
          fejlreaktion(4,i,string taleswitch_out_navn.raf(increase(j)),1);
      
        ia(1):= 3; <*canonical*>
        ia(2):= 0; <*no echo*>
        ia(3):= 0; <*prompt*>
        ia(4):= 2; <*timeout*>
        setcspterm(taleswitch_in_navn.laf,ia);
        setcspterm(taleswitch_out_navn.laf,ia);
      
        cs_op:= next_semch;
      
      <*+3*>skriv_new_sem(out,3,cs_op,<:cs-op(hovedmodul):>);
      <*-3*>
      
        cs_op_retur:= next_semch;
      
      <*+3*>skriv_new_sem(out,3,cs_op_retur,<:cs_op_retur:>);
      <*-3*>
      
        i:= nextcoru(200,<*ident*>
                      10,<*prioitet*>
                     true<*test_maske*>);
      
        j:= new_activity(         i,
                                  0,
                         h_operatør);
      
      <*+3*>skriv_newactivity(out,i,j);
      <*-3*>
      \f

      message operatør_initialisering side 2 - 810520/hko;
      
        for k:= 1 step 1 until max_antal_operatører do
        begin
          ref:= (k-1)*8;
          open(z_op(k),8,terminal_navn.ref,1 shift 21 +1 shift 9);
          i:= monitor(4) processaddress:(z_op(k),0,ia);
          ref:=k*terminal_beskr_længde;
          if i = 0 then
          begin
            fejlreaktion(3<*programfejl*>,k,<:skærm eksisterer ikke:>,1);
            terminal_tab.ref.terminal_tilstand:= 4 shift 21;
          end
          else
          begin
            terminal_tab.ref.terminal_tilstand:= 7 shift 21;<*ej knyttet*>
          end;
      
          cs_operatør(k):= next_semch;
      <*+3*>skriv_new_sem(out,3,cs_operatør(k),<:cs-operatør( ):>);
      <*-3*>
      
          cs_op_fil(k):= nextsemch;
      <*+3*> skriv_new_sem(out,3,cs_op_fil(k),<:cs-op-fil( ):>);
      <*-3*>
          signalch(cs_op_fil(k),nextop(filoplængde),op_optype);
      
          i:= next_coru(200+k,<*ident*>
                           10,<*prioitet*>
                          true<*testmaske*>);
          j:= new_activity(       i,
                                  0,
                           operatør,k);
      
      <*+3*>skriv_newactivity(out,i,j);
      <*-3*>
        end;
      
        cs_cqf:= next_semch;
      <*+3*>skriv_new_sem(out,3,cs_cqf,<:cs-cqf:>);
      <*-3*>
      
        signalch(cs_cqf,nextop(60),true);
      
        i:= next_coru(292, <*ident*>
                      10,  <*prioritet*>
                      true <*testmaske*>);
        j:= new_activity(         i,
                                  0,
                         op_cqftest);
      <*+3*>skriv_new_activity(out,i,j);
      <*-3*>
      
        cs_op_spool:= next_semch;
      <*+3*>skriv_new_sem(out,3,cs_op_spool,<:cs-op-spool:>);
      <*-3*>
      
        cs_op_medd:= next_semch;
      <*+3*>skriv_new_sem(out,3,cs_op_medd,<:cs-op-medd:>);
      <*-3*>
      
        ss_op_spool_tomme:= next_sem;
      <*+3*>skriv_new_sem(out,2,ss_op_spool_tomme,<:ss-op-spool-tomme:>);
      <*-3*>
        for i:= 1 step 1 until op_spool_postantal do signal(ss_op_spool_tomme);
      
        ss_op_spool_fulde:= next_sem;
      <*+3*>skriv_new_sem(out,2,ss_op_spool_fulde,<:ss-op-spool-fulde:>);
      <*-3*>
      
        signalch(cs_op_medd,nextop(data+op_spool_postlgd),gen_optype);
      
        i:= next_coru(293, <*ident*>
                      10,  <*prioritet*>
                      true <*testmaske*>);
        j:= new_activity(         i,
                                  0,
                         op_spool);
      <*+3*>skriv_new_activity(out,i,j);
      <*-3*>
      
        i:= next_coru(294, <*ident*>
                      10,  <*prioritet*>
                      true <*testmaske*>);
        j:= new_activity(         i,
                                  0,
                         op_medd);
      <*+3*>skriv_new_activity(out,i,j);
      <*-3*>
      
        cs_op_iomedd:= next_semch;
      <*+3*>skriv_new_sem(out,3,cs_op_iomedd,<:cs-op-iomedd:>);
      <*-3*>
      
        bs_opk_alarm:= next_sem;
      <*+3*>skriv_new_sem(out,1,bs_opk_alarm,<:bs-opk-alarm:>);
      <*-3*>
      
        cs_opk_alarm:= next_semch;
      <*+3*>skriv_new_sem(out,3,cs_opk_alarm,<:cs-opk-alarm:>);
      <*-3*>
      
        cs_opk_alarm_ur:= next_semch;
      <*+3*>skriv_new_sem(out,3,cs_opk_alarm_ur,<:cs-opk-alarm-ur:>);
      <*-3*>
      
        cs_opk_alarm_ur_ret:= next_semch;
      <*+3*>skriv_new_sem(out,3,cs_opk_alarm_ur_ret,<:cs-opk-alarm-ur-ret:>);
      <*-3*>
      
        cs_tvswitch_adgang:= next_semch;
      <*+3*>skriv_new_sem(out,3,cs_tvswitch_adgang,<:cs-tvswitch-adgang:>);
      <*-3*>
      
        cs_tv_switch_input:= next_semch;
      <*+3*>skriv_new_sem(out,3,cs_tv_switch_input,<:cs-tvswitch-input:>);
      <*-3*>
      
        cs_tv_switch_adm:= next_semch;
      <*+3*>skriv_new_sem(out,3,cs_tv_switch_adm,<:cs-tvswitch-adm:>);
      <*-3*>
      
        cs_talevejsswitch:= next_semch;
      <*+3*>skriv_new_sem(out,3,cs_talevejsswitch,<:cs-talevejsswitch:>);
      <*-3*>
      
        signalch(cs_op_iomedd,nextop(60),gen_optype);
      
        iaf:= nextop(data+128);
        if testbit22 then
          signal_ch(cs_tv_switch_adgang,iaf,op_optype)
        else
        begin
          startoperation(iaf,298,cs_tv_switch_adgang,'I' shift 12 + 44);
          signal_ch(cs_talevejsswitch,iaf,op_optype);
        end;
      
        i:= next_coru(295, <*ident*>
                      8,   <*prioritet*>
                      true <*testmaske*>);
        j:= new_activity(         i,
                                  0,
                         alarmur);
      <*+3*>skriv_new_activity(out,i,j);
      <*-3*>
      
        signal_ch(cs_opk_alarm_ur_ret,nextop(data),op_optype);
      
        i:= next_coru(296, <*ident*>
                      8,   <*prioritet*>
                      true <*testmaske*>);
        j:= new_activity(         i,
                                  0,
                         opkaldsalarmer);
      <*+3*>skriv_new_activity(out,i,j);
      <*-3*>
      
        i:= next_coru(297, <*ident*>
                      3,  <*prioritet*>
                      true <*testmaske*>);
        j:= new_activity(         i,
                                  0,
                         tv_switch_input);
      <*+3*>skriv_new_activity(out,i,j);
      <*-3*>
      
        for i:= 1,2 do
          signalch(cs_tvswitch_input,nextop(data+256),op_optype);
      
        i:= next_coru(298, <*ident*>
                      20,  <*prioritet*>
                      true <*testmaske*>);
        j:= new_activity(         i,
                                  0,
                         tv_switch_adm);
      <*+3*>skriv_new_activity(out,i,j);
      <*-3*>
      
        i:= next_coru(299, <*ident*>
                      3,   <*prioritet*>
                      true <*testmaske*>);
        j:= new_activity(         i,
                                  0,
                         talevejsswitch);
      <*+3*>skriv_new_activity(out,i,j);
      <*-3*>
      \f

      message garage_initialisering side 1 - 810521/hko;
      
        cs_gar:= next_semch;
      <*+3*>skriv_new_sem(out,3,cs_gar,<:cs-gar(hovedmodul):>);
      <*-3*>
      
        i:= next_coru(300,<*ident*>
                       10,<*prioritet*>
                      true<*test_maske*>);
      
        j:= new_activity(       i,
                                0,
                         h_garage);
      
      <*+3*>skriv_newactivity(out,i,j);
      <*-3*>
      
        for k:= 1 step 1 until max_antal_garageterminaler do
        begin
          ref:= (k-1)*8;
          open(z_gar(k),8,garage_terminal_navn.raf,1 shift 21 + 1 shift 9);
          ref:= (max_antal_operatører+k)*terminal_beskr_længde;
          i:=monitor(4)process address:(z_gar(k),0,ia);
          if i = 0 then
          begin
            fejlreaktion(4<*monitor result*>,k,<:garageterminal eksisterer ikke:>,1);
            terminal_tab.ref.terminal_tilstand:= 4 shift 21;
          end
          else
          begin
            terminal_tab.ref.terminal_tilstand:= 
              if garage_auto_include(k) then 0 else 7 shift 21;
            if garage_auto_include(k) then
              monitor(8)reserve:(z_gar(k),0,ia);
          end;
          cs_garage(k):= next_semch;
      <*+3*>skriv_new_sem(out,3,cs_garage(k),<:cs-garage( ):>);
      <*-3*>
          i:= next_coru(300+k,<*ident*>
                           10,<*prioritet*>
                         true <*testmaske*>);
          j:= new_activity(     i,
                                0,
                           garage,k);
      
      <*+3*>skriv_newactivity(out,i,j);
      <*-3*>
      
        end;
      \f

      message radio_initialisering side 1 - 820301/hko;
      
        cs_rad:= next_semch;
      <*+3*>skriv_new_sem(out,3,cs_rad,<:cs_rad(h_mod):>);
      <*-3*>
      
        i:= next_coru(400,<*ident*>
                       10,<*prioritet*>
                      true<*test_maske*>);
        j:= new_activity(      i,
                               0,
                         h_radio);
      <*+3*>skriv_newactivity(out,i,j);
      <*-3*>
      
        opkalds_kø_ledige:= max_antal_mobilopkald;
        nødopkald_brugt:= 0;
        læsfil(1034,1,i);
        tofrom(radio_områdetabel,fil(i),max_antal_områder*2);
      
        opkald_meldt:= opkaldskø_postlængde - op_maske_lgd;
        for i:= system(3,j,opkaldskø) step 1 until j do
          opkaldskø(i):= 0;
        første_frie_opkald:=opkaldskø_postlængde;
        første_opkald:=sidste_opkald:=
        første_nødopkald:=sidste_nødopkald:=j:=0;
      
        for i:=1 step 1 until max_antal_mobil_opkald -1 do
        begin
          ref:=i*opkaldskø_postlængde;
          opkaldskø.ref(1):=j:=j shift 12 +ref +opkaldskø_postlængde;
        end;
        ref:=ref+opkaldskø_postlængde;
        opkaldskø.ref(1):=j shift 12;
      
        for ref:= 0 step 512 until (max_linienr//768*512) do
        begin
          i:= læs_fil(1035,ref//512+1,j);
          if i <> 0 then
            fejlreaktion(5<*læs_fil*>,i,<:liniefordelingstabel:>,0);
          tofrom(radio_linietabel.ref,fil(j),
          if (((max_linienr+1 - (ref//2*3))+2)//3*2) > 512 then 512
          else ((max_linienr+1 - (ref//2*3))+2)//3*2);
        end;
      
        for i:= system(3,j,kanal_tab) step 1 until j do
          kanal_tab(i):= 0;
        kanal_tilstand:= 2;
        kanal_id1:= 4;
        kanal_id2:= 6;
        kanal_spec:= 8;
        kanal_alt_id1:= 10;
        kanal_alt_id2:= 12;
        kanal_mon_maske:= 12;
        kanal_alarm:= kanal_mon_maske+tv_maske_lgd;
      
        for i:= 1 step 1 until max_antal_kanaler do
        begin
          ref:= (i-1)*kanalbeskrlængde;
          sæthexciffer(kanal_tab.ref,3,15);
          if kanal_id(i) shift (-5) extract 3 = 2 or
             kanal_id(i) shift (-5) extract 3 = 3 and
             radio_id(kanal_id(i) extract 5)<=3
          then
          begin
            sætbiti(kanal_tab.ref.kanal_tilstand,11,1);
            sætbiti(kanal_tab.ref.kanal_tilstand,10,1);
          end;
        end;
        tofrom(opkaldsflag,alle_operatører,op_maske_lgd);
        tofrom(samtaleflag,ingen_operatører,op_maske_lgd);
        tofrom(hookoff_maske,ingen_taleveje,tv_maske_lgd);
        optaget_flag:= 0;
      \f

      message radio_initialisering side 2 - 810524/hko;
      
        bs_mobil_opkald:= next_sem;
      
      <*+3*>skriv_new_sem(out,1,bs_mobil_opkald,<:bs_mobil_opkald:>);
      <*-3*>
      
        bs_opkaldskø_adgang:= next_sem;
        signal_bin(bs_opkaldskø_adgang);
      
      <*+3*>skriv_new_sem(out,1,bs_opkaldskø_adgang,<:bs_opk.kø_adgang:>);
      <*-3*>
      
        cs_radio_medd:=next_semch;
        signal_ch(cs_radio_medd,nextop(data+6),gen_optype or rad_optype);
      
      <*+3*>skriv_new_sem(out,3,cs_radio_medd,<:cs_radio_medd:>);
      <*-3*>
      
        i:= next_coru(403,
                        5,<*prioritet*>
                      true<*testmaske*>);
      
        j:= new_activity(      i,
                               0,
               radio_medd_opkald);
      
      <*+3*>skriv_newactivity(out,i,j);
      <*-3*>
      
      cs_radio_adm:= nextsemch;
      <*+3*>skriv_new_sem(out,3,cs_radio_adm,<:cs_radio_adm:>);
      <*-3*>
      
      i:= next_coru(404,
                     10,
                   true);
      j:= new_activity(i,
                       0,
                       radio_adm,next_op(data+radio_op_længde));
      <*+3*>skriv_new_activity(out,i,j);
      <*-3*>
      \f

      message radio_initialisering side 3 - 810526/hko;
       for k:= 1 step 1 until max_antal_taleveje do
       begin
      
        cs_radio(k):=next_semch;
      
      <*+3*>skriv_new_sem(out,3,cs_radio(k),<:cs_radio(  ):>);
      <*-3*>
      
        bs_talevej_udkoblet(k):= nextsem;
      <*+3*>skriv_new_sem(out,1,bs_talevej_udkoblet(k),<:bs_talevej_udkoblet( ):>);
      <*-3*>
      
        i:=next_coru(410+k,
                      10,
                     true);
      
        j:=new_activity(     i,
                             0,
                        radio,k,next_op(data + radio_op_længde));
      
      <*+3*>skriv_newactivity(out,i,j);
      <*-3*>
       end;
      
        cs_radio_pulje:=next_semch;
      
      <*+3*>skriv_new_sem(out,3,cs_radio_pulje,<:cs-radio-pulje:>);
      <*-3*>
      
        for i:= 1 step 1 until radiopulje_størrelse do
          signal_ch(cs_radio_pulje,
                    next_op(60),
                    gen_optype or rad_optype);
      
        cs_radio_kø:= next_semch;
      
      <*+3*>skriv_new_sem(out,3,cs_radio_kø,<:cs_radio_kø:>);
      <*-3*>
      
        mobil_opkald_aktiveret:= true;
      \f

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

      message radio_initialisering side 5 - 810521/hko;
          for k:= 1 step 1 until max_antal_kanaler do
          begin
      
            ss_radio_aktiver(k):=next_sem;
      <*+3*>skriv_new_sem(out,2,ss_radio_aktiver(k),<:ss_rad_aktiver( ):>);
      <*-3*>
      
            ss_samtale_nedlagt(k):=next_sem;
      <*+3*>skriv_new_sem(out,2,ss_samtale_nedlagt(k),<:ss_samtale_nedlagt(  ):>);
      <*-3*>
          end;
      
          cs_radio_ind:= next_semch;
      <*+3*>skriv_new_sem(out,3,cs_radio_ind,<:cs_radio_ind:>);
      <*-3*>
      
          i:= next_coru(401,<*ident radio_ind*>
                           3, <*prioritet*>
                         true <*testmaske*>);
          j:= new_activity(      i,
                                 0,
                           radio_ind,next_op(data + 64));
      
      <*+3*>skriv_newactivity(out,i,j);
      <*-3*>
      
          cs_radio_ud:=next_semch;
      <*+3*>skriv_new_sem(out,3,cs_radio_ud,<:cs_radio_ud:>);
      <*-3*>
      
          i:= next_coru(402,<*ident radio_out*>
                           10,<*prioritet*>
                         true <*testmaske*>);
          j:= new_activity(         i,
                                    0,
                           radio_ud,next_op(data + 64));
      
      <*+3*>skriv_newactivity(out,i,j);
      <*-3*>
      \f

      message vogntabel initialisering side 1 - 820301;
      
      sidste_bus:= sidste_linie_løb:= 0;
      
      tf_vogntabel:= 1 shift 10 + 2;
      tf_gruppedef:= ia(4):= 1 shift 10 +3;
      tf_gruppeidenter:= 1 shift 10 +6;
      tf_springdef:= 1 shift 10 +7;
      hent_fil_dim(ia);
      max_antal_i_gruppe:= ia(2);
      if ia(1) < max_antal_grupper then
        max_antal_grupper:= ia(1);
      
      <* initialisering af interne vogntabeller *>
      begin
        long array field laf1,laf2;
        integer array fdim(1:8);
        zone z(128,1,stderror);
        integer busnr,i,j,zi,s,pant,ll_nr,b_nr,res,tegn,g_nr,o_nr;
        long omr,garageid;
        integer field ll, bn;
        boolean binær, test24;
      
        ll:= 2; bn:= 4;
        
        <* nulstil tabellerne *>
        laf1:= -2;
        laf2:=  2;
        bustabel1.laf2(0):=
        bustabel.laf2(0):= bustilstand.laf2(0):= linie_løb_tabel.laf2(0):= 
        bus_indeks.laf2(0):= linie_løb_indeks.laf2(0):= extend 0;
        tofrom(bustabel.laf2,bustabel.laf1,(max_antal_busser+1)*2-4);
        tofrom(bustabel1.laf2,bustabel1.laf1,(max_antal_busser+1)*2-4);
        tofrom(linie_løb_tabel.laf2,linie_løb_tabel.laf1,(max_antal_linie_løb+1)*2-4);
        tofrom(busindeks.laf2,busindeks.laf1,max_antal_linie_løb-4);
        tofrom(linie_løb_indeks.laf2,linie_løb_indeks.laf1,max_antal_busser-4);
        tofrom(bustilstand.laf2,bustilstand.laf1,max_antal_busser-4);
      \f

      message vogntabel initialisering side 1a - 810505/cl;
      
      
        <* initialisering af intern busnummertabel *>
        open(z,4,<:busnumre:>,0);
        busnr:= -1;
        read(z,busnr);
        while busnr > 0 do
        begin
          if busnr < bustabel(sidste_bus) extract 14 or busnr >= 1 shift 14 then
            fejlreaktion(10,busnr,<:fejl i busnrfil:>,0);
          sidste_bus:= sidste_bus+1;
          if sidste_bus > max_antal_busser then
            fejlreaktion(10,busnr,<:for mange busser i busnrfil:>,0);
          repeatchar(z); readchar(z,tegn);
          garageid:= extend 0; binær:= false; omr:= extend 0;
          g_nr:= o_nr:= 0;
          if tegn='!' then
          begin
            binær:= true;
            readchar(z,tegn);
          end;
          if tegn='/' then <*garageid*>
          begin
            readchar(z,tegn); repeatchar(z);
            if '0'<=tegn and tegn<='9' then
            begin
              read(z,g_nr); if g_nr<1 or g_nr>max_antal_operatører then g_nr:= 0;
              if g_nr<>0 then garageid:=bpl_navn(g_nr);
              if g_nr<>0 and garageid=long<::> then
              begin
                fejlreaktion(10,busnr,<:ukendt garageidentifikation for bus:>,1);
                g_nr:= 0;
              end;
            end
            else
            begin
              while ('A'<= tegn and tegn <='Å') or ('0'<=tegn and tegn<='9') do
              begin
                garageid:= garageid shift 8 + tegn;
                readchar(z,tegn);
              end;
              while garageid shift (-40) extract 8 = 0 do
                garageid:= garageid shift 8;
              g_nr:= find_bpl(garageid);
              if g_nr=0 then
                fejlreaktion(10,busnr,<:ukendt garageidentifikation for bus:>,1);
            end;
            repeatchar(z); readchar(z,tegn);
          end;
          if tegn=';' then
          begin
            readchar(z,tegn); repeatchar(z);
            if '0'<=tegn and tegn<='9' then
            begin
              read(z,o_nr);
              if o_nr<1 or max_antal_områder<o_nr then o_nr:= 0;
              if o_nr<>0 then omr:= område_navn(o_nr);
              if o_nr<>0 and omr=long<::> then
              begin
                fejlreaktion(10,busnr,<:ukendt områdeidentifikation for bus:>,1);
                o_nr:= 0;
              end;
            end
            else
            begin
              while ('A'<=tegn and tegn<='Å') or ('0'<=tegn and tegn<='9') do
              begin
                omr:= omr shift 8 + tegn;
                readchar(z,tegn);
              end;
              while omr shift (-40) extract 8 = 0 do
                omr:= omr shift 8;
              if omr=long<:TCT:> then omr:=long<:KBH:>;
              i:= 1;
              while i<=max_antal_områder and o_nr=0 do
              begin
                if omr=område_navn(i) then o_nr:= i;
                i:= i+1;
              end;
              if o_nr=0 then
                fejlreaktion(10,busnr,<:ukendt områdeidentifikation for bus:>,1);
            end;
            repeatchar(z); readchar(z,tegn);
          end;
          if o_nr=0 then o_nr:= 3;
          bustabel (sidste_bus):= g_nr shift 14 + busnr;
          bustabel1(sidste_bus):= (binær extract 1) shift 23 + o_nr;
      
          busnr:= -1;
          read(z,busnr);
        end;
        close(z,true);
      \f

      message vogntabel initialisering side 2 - 820301/cl;
      
        <* initialisering af intern linie/løbs-tabel og bus-indekstabel *>
        test24:= testbit24;
        testbit24:= false;
        i:= 1;
        s:= læsfil(tf_vogntabel,i,zi);
        if s<>0 then fejlreaktion(5,s,<:vogntabelinit:>,0);
        while fil(zi).bn<>0 do
        begin
          if fil(zi).ll <> 0 then
          begin <* indsæt linie/løb *>
            res:= binærsøg(sidste_linie_løb,linie_løb_tabel(j) -
                    fil(zi).ll,j);
            if res < 0 then j:= j+1;
            if res = 0 then fejlreaktion(10,fil(zi).bn,
              <:dobbeltregistrering i vogntabel:>,1)
            else
            begin
              o_nr:= fil(zi).bn shift (-14) extract 8;
              b_nr:= søg_omr_bus(fil(zi).bn extract 14,ll_nr,g_nr,o_nr,s,tegn);
              if b_nr<0 then fejlreaktion(10,fil(zi).bn extract 14,
                <:ukendt bus i vogntabel:>,1)
              else
              begin
                if sidste_linie_løb >= max_antal_linie_løb then
                  fejlreaktion(10,fil(zi).bn extract 14,
                      <:for mange linie/løb i vogntabel:>,0);
                for ll_nr:= sidste_linie_løb step (-1) until j do
                begin
                  linie_løb_tabel(ll_nr+1):= linie_løb_tabel(ll_nr);
                  bus_indeks(ll_nr+1):= bus_indeks(ll_nr);
                end;
                linie_løb_tabel(j):= fil(zi).ll;
                bus_indeks(j):= false add b_nr;
                sidste_linie_løb:= sidste_linie_løb + 1;
              end;
            end;
          end;
          i:= i+1;
          s:= læsfil(tf_vogntabel,i,zi);
          if s<>0 then fejlreaktion(5,s,<:vogntabelinit:>,0);
        end;
      \f

      message vogntabel initialisering side 3 - 810428/cl;
      
        <* initialisering af intern linie/løb-indekstabel *>
        for ll_nr:= 1 step 1 until sidste_linie_løb do
          linie_løb_indeks(bus_indeks(ll_nr) extract 12):= false add ll_nr;
      
        <* gem ny vogntabel i tabelfil *>
        for i:= 1 step 1 until sidste_bus do
        begin
          s:= skriv_fil(tf_vogntabel,i,zi);
          if s<>0 then fejlreaktion(6,s,<:vogntabelinit:>,0);
          fil(zi).bn:= bustabel(i) extract 14 add
                       (bustabel1(i) extract 8 shift 14);
          fil(zi).ll:= linie_løb_tabel(linie_løb_indeks(i) extract 12);
        end;
        fdim(4):= tf_vogntabel;
        hent_fil_dim(fdim);
        pant:= fdim(3) * (256//fdim(2));
        for i:= sidste_bus+1 step 1 until pant do
        begin
          s:= skriv_fil(tf_vogntabel,i,zi);
          if s<>0 then fejlreaktion(6,s,<:vogntabelinit:>,0);
          fil(zi).ll:= fil(zi).bn:= 0;
        end;
      
        <* initialisering/nulstilling af gruppetabeller *>
        for i:= 1 step 1 until max_antal_grupper do
        begin
          s:= læs_fil(tf_gruppeidenter,i,zi);
          if s <> 0 then fejlreaktion(5,s,<:gruppetabelinit:>,0);
          gruppetabel(i):= fil(zi).ll;
        end;
        for i:= 1 step 1 until max_antal_gruppeopkald do
          gruppeopkald(i,1):= gruppeopkald(i,2):= 0;
        testbit24:= test24;
      end;
      
      
      <*+2*>
      <**> if testbit40 then p_vogntabel(out);
      <**> if testbit43 then p_gruppetabel(out);
      <*-2*>
      
      message vogntabel initialisering side 3a -920517/cl;
      
        <* initialisering for vt_log *>
      
        v_tid:= 4;
        v_kode:= 6;
        v_bus:= 8;
        v_ll1:= 10;
        v_ll2:= 12;
        v_tekst:= 6;
        for i:= 1 step 1 until 4 do vt_logdisc(i):= 0;
        for i:= 1 step 1 until 10 do vt_log_tail(i):= 0;
        if vt_log_aktiv then
        begin
          integer i;
          real t;
          integer array field iaf;
          integer array
            tail(1:10),ia(1:10),chead(1:20);
      
          open(zvtlog,4,<:vtlogpool:>,0); close(zvtlog,true);
          i:= monitor(42)lookup_entry:(zvtlog,0,tail);
          if i=0 then
            i:=monitor(52)create_areaproc:(zvtlog,0,ia);
          if i=0 then
          begin
            i:=monitor(8)reserve_process:(zvtlog,0,ia);
            monitor(64)remove_areaproc:(zvtlog,0,ia);
          end;
      
          if i=0 then
          begin
            iaf:= 2;
            tofrom(vt_logdisc,tail.iaf,8);
            i:=slices(vt_logdisc,0,tail,chead);
            if i > (-2048) then
            begin
              vt_log_slicelgd:= chead(15);
              i:= 0;
            end;
          end;
      
          if i=0 then
          begin
            open(zvtlog,4,<:vtlogklar:>,0); close(zvtlog,true);
            i:=monitor(42)lookup_entry:(zvtlog,0,tail);
            if i=0 then
              i:= monitor(52)create_areapproc:(zvtlog,0,ia);
            if i=0 then
            begin
              i:=monitor(8)reserve_process:(zvtlog,0,ia);
              monitor(64)remove_areaproc:(zvtlog,0,ia);
            end;
      
            if i<>0 then
            begin
              for i:= 1 step 1 until 10 do tail(i):= 0;
              tail(1):= 1;
              iaf:= 2;
              tofrom(tail.iaf,vt_logdisc,8);
              tail(6):=systime(7,0,t);
              i:=monitor(40)create_entry:(zvtlog,0,tail);
              if i=0 then
                i:=monitor(50)permanent_entry:(zvtlog,3,ia);
            end;
          end;
      
          if i<>0 then vt_log_aktiv:= false;
        end;
      
      
      \f

      message vogntabel initialisering side 4 - 810520/cl;
      
      cs_vt:= nextsemch;
      <*+3*> skriv_new_sem(out,3,cs_vt,<:cs-vt:>);
      <*-3*>
      
      cs_vt_adgang:= nextsemch;
      <*+3*> skriv_new_sem(out,3,cs_vt_adgang,<:cs-vt-adgang:>);
      <*-3*>
      
      cs_vt_opd:= nextsemch;
      <*+3*> skriv_new_sem(out,3,cs_vt_opd,<:cs-vt-opd:>);
      <*-3*>
      
      cs_vt_rap:= nextsemch;
      <*+3*> skriv_new_sem(out,3,cs_vt_rap,<:cs-vt-rap:>);
      <*-3*>
      
      cs_vt_tilst:= nextsemch;
      <*+3*> skriv_new_sem(out,3,cs_vt_tilst,<:cs-vt-tilst:>);
      <*-3*>
      
      cs_vt_auto:= nextsemch;
      <*+3*> skriv_new_sem(out,3,cs_vt_auto,<:cs-vt-auto:>);
      <*-3*>
      
      cs_vt_grp:= nextsemch;
      <*+3*> skriv_new_sem(out,3,cs_vt_grp,<:cs-vt-grp:>);
      <*-3*>
      
      cs_vt_spring:= nextsemch;
      <*+3*> skriv_new_sem(out,3,cs_vt_spring,<:cs-vt-spring:>);
      <*-3*>
      
      cs_vt_log:= nextsemch;
      <*+3*> skriv_new_sem(out,3,cs_vt_log,<:cs-vt-log:>);
      <*-3*>
      
      cs_vt_logpool:= nextsemch;
      <*+3*> skriv_new_sem(out,3,cs_vt_logpool,<:cs-vt-logpool:>);
      <*-3*>
      
      vt_op:= nextop(vt_op_længde);
      signalch(cs_vt_adgang,vt_op,gen_optype or vt_optype);
      
      vt_logop(1):= nextop(vt_op_længde);
      signalch(cs_vt_logpool,vt_logop(1),vt_optype);
      vt_logop(2):= nextop(vt_op_længde);
      signalch(cs_vt_logpool,vt_logop(2),vt_optype);
      
      \f

      message vogntabel initialisering side 5 - 81-520/cl;
      
      i:= nextcoru(500, <*ident*>
                    10, <*prioitet*>
                   true <*testmaske*>);
      j:= new_activity( i,
                        0,
                       h_vogntabel);
      <*+3*> skriv_newactivity(out,i,j);
      <*-3*>
      
      i:= nextcoru(501,   <*ident*>
                    10,   <*prioritet*>
                   true   <*testmaske*>);
      iaf:= nextop(filop_længde);
      j:= new_activity(i,
                       0,
                       vt_opdater,iaf);
      <*+3*> skriv_newactivity(out,i,j);
      <*-3*>
      
      i:= nextcoru(502,   <*ident*>
                    10,   <*prioritet*>
                   true   <*testmaske*>);
      k:= nextsemch;
      <*+3*> skriv_new_sem(out,3,k,<:cs-fil(vt-tilst):>);
      <*-3*>
      iaf:= nextop(fil_op_længde);
      j:= newactivity(i,
                      0,
                      vt_tilstand,
                      k,
                      iaf);
      <*+3*> skriv_newactivity(out,i,j);
      <*-3*>
      \f

      message vogntabel initialisering side 6 - 810520/cl;
      
      i:= nextcoru(503,   <*ident*>
                    10,   <*prioritet*>
                   true   <*testmaske*>);
      k:= nextsemch;
      <*+3*> skriv_new_sem(out,3,k,<:cs-fil(vt-rapport):>);
      <*-3*>
      iaf:= nextop(fil_op_længde);
      j:= newactivity(i,
                      0,
                      vt_rapport,
                      k,
                      iaf);
      <*+3*> skriv_newactivity(out,i,j);
      <*-3*>
      
      i:= nextcoru(504,   <*ident*>
                    10,   <*prioritet*>
                   true   <*testmaske*>);
      k:= nextsemch;
      <*+3*> skriv_new_sem(out,3,k,<:cs-fil(vt-gruppe):>);
      <*-3*>
      iaf:= nextop(fil_op_længde);
      j:= new_activity(i,
                       0,
                       vt_gruppe,
                       k,
                       iaf);
      <*+3*> skriv_newactivity(out,i,j);
      <*-3*>
      \f

      message vogntabel initialisering side 7 - 810520/cl;
      
      i:= nextcoru(505,   <*ident*>
                    10,   <*prioritet*>
                   true   <*testmaske*>);
      k:= nextsemch;
      <*+3*> skriv_new_sem(out,3,k,<:cs-spring-retur:>);
      <*-3*>
      iaf:= nextop(fil_op_længde);
      j:= newactivity(i,
                      0,
                      vt_spring,
                      k,
                      iaf);
      <*+3*> skriv_newactivity(out,i,j);
      <*-3*>
      
      i:= nextcoru(506,   <*ident*>
                    10,
                   true   <*testmaske*>);
      k:= nextsemch;
      <*+3*> skriv_new_sem(out,3,k,<:cs-auto-retur:>);
      <*-3*>
      iaf:= nextop(if fil_op_længde>(data+20) then fil_op_længde else (data+20));
      j:= newactivity(i,
                      0,
                      vt_auto,
                      k,
                      iaf);
      <*+3*> skriv_newactivity(out,i,j);
      <*-3*>
      
      i:=nextcoru(507, <*ident*>
                   10, <*prioritet*>
                  true <*testmaske*>);
      j:=newactivity(i,
                     0,
                     vt_log);
      <*+3*> skriv_newactivity(out,i,j);
      <*-3*>
      
      <*+2*>
      <**> if testbit42  then skriv_vt_variable(out);
      <*-2*>
      \f

      message sysslut initialisering side 1 - 810406/cl;
      begin
        zone z(128,1,stderror);
        integer i,coruid,j,k;
        integer array field cor;
      
        open(z,4,<:overvågede:>,0);
        for i:= read(z,coruid) while i > 0 do
        begin
          if coruid = 0 then
          begin
            for coruid:= 1 step 1 until maxcoru do
            begin
              cor:= coroutine(coruid);
              d.cor.corutestmask:= d.cor.corutestmask shift 1 shift (-1);
            end
          end
          else
          begin
            cor:= coroutine(coru_no(abs coruid));
            if cor > 0 then
            begin
              d.cor.corutestmask:=
                (d.cor.corutestmask shift 1 shift (-1)) add
                ((coruid > 0) extract 1 shift 11);
            end;
          end;
        end;
        close(z,true);
      
        læsfil(tf_systællere,1,k);
        rf:=iaf:= 4;
        systællere_nulstillet:= fil(k).rf;
        nulstil_systællere:= fil(k).iaf(1);
        if systællere_nulstillet=real<::> then
        begin
          systællere_nulstillet:= 0.0;
          nulstil_systællere:= -1;
        end;
        iaf:= 32;
        tofrom(opkalds_tællere,fil(k).iaf,max_antal_områder*10);
        iaf:= 192;
        tofrom(operatør_tællere,fil(k).iaf,max_antal_operatører*10);
      
      end;
      \f

      message sysslut initialisering side 2 - 810603/cl;
      
      
        if låsning > 0 then
          <* låsning 1 : *>  lock(takeexternal,coru_term,mon,1); <* centrallogik *>
      
        if låsning > 1 then
          <* låsning 2 : *>  lock(readchar,1,write,2);
      
        if låsning > 2 then
          <* låsning 3 : *>  lock(activate,1,link,1,setposition,1);
      
      
      
      
        if låsning > 0 then
        begin
          i:= locked(ia);
          write(z_io,"nl",2,<:låsning::>,låsning,"nl",1,i,<: segmenter er låst:>);
        end;
      \f

      message sysslut initialisering side 3 - 810406/cl;
      
      write(z_io,"nl",2,<:initialisering slut:>);
      system(2)free core:(i,ra);
      write(z_io,"nl",1,<:free core =:>,i,"nl",1);
      setposition(z_io,0,0);
      write(zbillede,"ff",0,"nl",1,<:initialisering slut :>,<<zddddd>,
            systime(5,0,r),".",1,r,"nl",1,<:free core=:>,i,
            "nl",1);
      errorbits:= 3; <* ok.no warning.yes *>
\f


algol list.off;
message coroutinemonitor - 40 ;

      if simref <> firstsem then initerror(1, false);
      if semref <> firstop - 4 then initerror(2, false);
      if coruref <> firstsim then initerror(3, false);
      if opref <> optop + 6 then initerror(4, false);
      if proccount <> maxprocext -1 then initerror(5, false);
      goto takeexternal;

dump:
  op:= op;
    \f

    message sys trapaktion side 1 - 810521/hko/cl;
      trap(finale);
      write(zbillede,"ff",1,"nl",1,<:***** coroutine-monitor køer *****:>);
      for i:= 4<*readyqueue*>, 8<*idlequeue*>, 12<*timerqueue*> do
      begin
        k:= 0;
        write(zbillede,"nl",2,case i//4 of(<:readyqueue->:>,<:idlequeue ->:>,
          <:timerqueue->:>));
        iaf:= i;
        for iaf:= d.iaf.next while iaf<>i do
        begin
          ref:= firstcoru + (iaf-firstcoru)//corusize*corusize;
          write(zbillede,<: cr:>,<<zdd>,d.ref.coruident//1000);
          k:=k+1; if k mod 10 = 0 then write(zbillede,"nl",1,"sp",12);
        end;
      end;
      outchar(zbillede,'nl');
    
      skriv_opkaldstællere(zbillede);
    
    
    pfilsystem(zbillede);
    
    
    write(zbillede,"nl",2,"=",20,<: attentionmodul :>,"=",20,"nl",1);
    
    write(zbillede,"nl",1,<:attention-flag: :>,"nl",1);
    outintbits_ia(zbillede,att_flag,1,att_maske_lgd//2);
    
    write(zbillede,"nl",1,<:attention-signal: :>,"nl",1);
    outintbits_ia(zbillede,att_signal,1,att_maske_lgd//2);
    \f

    message operatør trapaktion1 side 1 - 810521/hko;
      write(zbillede,"nl",2,"=",20,<: operatørmodul :>,"=",20,"nl",1);
    
      write(zbillede,"nl",1,<:betjeningspladsnavne::>,"nl",1);
      for i:= 1 step 1 until max_antal_operatører do
      begin
        laf:= (i-1)*8;
        write(zbillede,<<dd>,i,<:: :>,true,6,string bpl_navn(i),
          case operatør_auto_include(i) extract 2 + 1 of (
          <:EK    :>,<:IN(ÅB):>,<:??    :>,<:IN(ST):>),<:   :>,
          terminal_navn.laf,"nl",1);
      end;
      write(zbillede,"nl",1);
    
      write(zbillede,"nl",1,<:top-bpl-gruppe: :>,<<d>,top_bpl_gruppe,"nl",1,
        <:betjeningspladsgrupper::>,"nl",1);
      for i:= 1 step 1 until 127 do
      if bpl_navn(i)<>long<::> then
      begin
        k:= write(zbillede,<<dd >,i,true,6,string bpl_navn(i),<:(:>,<<d>,
          bpl_tilst(i,1),<:/:>,bpl_tilst(i,2),<:):>);
        write(zbillede,"sp",16-k,<:= :>);
        iaf:= i*op_maske_lgd; j:=0;
        for k:= 1 step 1 until max_antal_operatører do
        begin
          if læsbit_ia(bpl_def.iaf,k) then
          begin
            if j mod 6 = 0 and j > 0 then write(zbillede,"nl",1,"sp",18);
            write(zbillede,true,6,string bpl_navn(k));
            j:= j+1;
          end;
        end;
        write(zbillede,"nl",1);
      end;
    
      write(zbillede,"nl",1,<:stoptabel::>,"nl",1);
      for i:= 1 step 1 until max_antal_operatører do
      begin
        write(zbillede,<<dd >,i);
        for j:= 0 step 1 until 3 do
        begin
          k:= operatør_stop(i,j);
          write(zbillede,if j=0 then <: :> else <:->:>,if k=0 then <:ALLE:>
            else string bpl_navn(k));
        end;
        write(zbillede,<:  (:>,<<d>,ant_i_opkø(i),<:):>,"nl",1);
      end;
    
      skriv_terminal_tab(zbillede);
      write(zbillede,"nl",1,<:operatør-maske::>,"nl",1);
      outintbits_ia(zbillede,operatørmaske,1,op_maske_lgd//2);
      skriv_opk_alarm_tab(zbillede);
      skriv_talevejs_tab(zbillede);
      skriv_op_spool_buf(zbillede);
      skriv_cqf_tabel(zbillede,true);
      write(zbillede,"nl",2,"=",20,<: garagemodul :>,"=",20,"nl",1);
      
      write(zbillede,"nl",1,<:garageterminaler::>,"nl",1);
      for i:= 1 step 1 until max_antal_garageterminaler do
      begin
        laf:= (i-1)*8;
        write(zbillede,<<dd>,i,<:: :>, if garage_auto_include(i) then
          <:IN,G  :> else <:EK,G  :>,garage_terminal_navn.laf,"nl",1);
      end;
    \f

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

    message vogntabel trapaktion side 1 - 810520/cl;
    write(zbillede,"nl",2,"=",20,<: vogntabelmodul :>,"=",20,"nl",1);
    skriv_vt_variable(zbillede);
    p_vogntabel(zbillede);
    p_gruppetabel(zbillede);
    p_springtabel(zbillede);
    \f

    message sysslut trapaktion side 1 - 810519/cl;
    write(zbillede,"nl",2,"=",20,<: corutinemonitor :>,"=",20,"nl",1);
    corutable(zbillede);
    write(zbillede,"ff",1,<:***** simple semaphores *****:>,"nl",2,
      <: ref værdi prev next:>,"nl",1);
    iaf:= firstsim;
    repeat
      write(zbillede,<<dddd>,iaf,<< -dddd>,d.iaf.simvalue,<< dddd>,
        d.iaf(simcoru//2-1),d.iaf.simcoru,"nl",1);
      iaf:= iaf + simsize;
    until iaf>=simref;
    write(zbillede,"ff",1,<:***** chained semaphores *****:>,"nl",2,
      <: ref prev.coru next.coru   prev.op   next.op:>,"nl",1);
    iaf:= firstsem;
    repeat
      write(zbillede,<<dddd>,iaf,<<______dddd>,d.iaf(semcoru//2-1),
        d.iaf.semcoru,d.iaf(semop//2-1),d.iaf.semop,"nl",1);
      iaf:= iaf+semsize;
    until iaf>=semref;
    write(zbillede,"ff",1,<:***** operations *****:>,"nl",2);
    iaf:= firstop;
    repeat
      skriv_op(zbillede,iaf);
      iaf:= iaf+opheadsize+d.iaf.opsize;
    until iaf>=optop;
    write(zbillede,"ff",1,<:***** message extentions *****:>,"nl",2,
      <:  messref messcode   messop:>,"nl",1);
    for i:= 1 step 1 until maxmessext do
      write(zbillede,<< dddddddd>,messref(i),messcode(i),messop(i),"nl",1);
    write(zbillede,"nl",4,<:***** process extentions *****:>,"nl",2,
      <:  procref proccode   procop:>,"nl",1);
    for i:= 1 step 1 until maxprocext do
      write(zbillede,<< dddddddd>,procref(i),proccode(i),procop(i),"nl",1);
    

    \f

    message sys_finale side 1 - 810428/hko;
    
    finale:
       trap(slut_finale);
    <* algol_pause:=algol_pause shift 24 shift (-24); *>
       endaction:=0;
    \f

    message filsystem finale side 1 - 810428/cl;
    
    <* lukning af zoner *>
    write(out,<:lukker filsystem:>); ud;
    for i:= 1 step 1 until dbantez+dbantsz+dbanttz do
      close(fil(i),true);
    \f

    message operatør_finale side 1 - 810428/hko;
    
    goto op_trap2_slut;
    
      write(out,<:lukker operatører:>); ud;
      for k:= 1 step 1 until max_antal_operatører do
      begin
        close(z_op(k),true);
      end;
    op_trap2_slut:
      k:=k;
    
    \f

    message garage_finale side 1 - 810428/hko;
    
      write(out,<:lukker garager:>); ud;
      for k:= 1 step 1 until max_antal_garageterminaler do
      begin
        close(z_gar(k),true);
      end;
    \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);
    \f

    message sysslut finale side 1 - 810530/cl;
    
    slut_finale:
    
    trap(exit_finale);
    
    outchar(zrl,'em');
    close(zrl,true);
    
    write(zbillede,
            "nl",2,<:blocksread=:>,blocksread,
            "nl",1,<:blocksout= :>,blocksout,
            "nl",1,<:fillæst=   :>,fillæst,
            "nl",1,<:filskrevet=:>,filskrevet,
            "nl",3,<:********** billede genereret :>,<<zddddd>,
      systime(5,0,r),".",1,r,<: **********:>,"nl",1,"em",1);
    close(zbillede,true);
    monitor(42,zbillede,0,ia);
    ia(6):= systime(7,0,0.0);
    monitor(44,zbillede,0,ia);
    setposition(z_io,0,0);
    write(z_io,"nl",3,"sp",10,"*",15,<: busradio afsluttet :>,<<zddddd>,
      systime(5,0,r),".",1,r,"sp",1,"*",15,"nl",1,"em",1);
    close(z_io,true);
    exit_finale: trapmode:= 1 shift 10;

  end;


algol list.on;
message programslut;
program_slut:
end
▶EOF◀