|
DataMuseum.dkPresents historical artifacts from the history of: RC4000/8000/9000 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about RC4000/8000/9000 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 124416 (0x1e600) Types: TextFile Names: »htradio «
└─⟦110021343⟧ Bits:30007476 RC8000 Backup tape fra HT's bus-radio system └─⟦a957ba283⟧ └─⟦this⟧ »htradio «
radio. :1: radio: parametererklæringer \f message procedure radio_parametererklæringer side 1 - 810524/hko; integer radio_giveup, opkaldskø_postlængde, kanal_beskr_længde, radio_op_længde, radio_pulje_størrelse; :2: radio: parameterinitialisering \f message procedure radio_parameterinitialisering side 1 - 810601/hko; radio_giveup:= 1 shift 21 + 1 shift 9; opkaldskø_postlængde:= 10+op_maske_lgd; kanal_beskr_længde:= 12+op_maske_lgd+tv_maske_lgd; radio_op_længde:= 30*2; radio_pulje_størrelse:= 1+max_antal_taleveje; :3: radio: claiming \f message procedure radio_claiming side 1 - 810526/hko; max_coru:= max_coru +1 <* hovedmodul radio *> +1 <* opkaldskø_meddelelse *> +1 <* radio_adm *> +max_antal_taleveje <* radio *> +2; <* radio ind/-ud*> max_semch:= max_semch +1 <* cs_rad *> +max_antal_taleveje <* cs_radio *> +1 <* cs_radio_pulje *> +1 <* cs_radio_kø *> +1 <* cs_radio_medd *> +1 <* cs_radio_adm *> +2 ; <* cs_radio_ind/-ud *> max_sem:= +1 <* bs_mobil_opkald *> +1 <* bs_opkaldskø_adgang *> +max_antal_kanaler <* ss_radio_aktiver *> +max_antal_kanaler <* ss_samtale_nedlagt *> +max_antal_taleveje <* bs_talevej_udkoblet *> +max_sem; max_op:= + radio_pulje_størrelse <* radio_pulje_operationer *> + 1 <* radio_medd *> + 1 <* radio_adm *> + max_antal_taleveje <* operationer for radio *> + 2 <* operationer for radio_ind/-ud *> + max_op; max_netto_op:= + radio_pulje_størrelse * 60 <* radio_pulje_operationer *> + data + 6 <* radio_medd *> + max_antal_taleveje <* operationer for radio *> * (data + radio_op_længde) + data + radio_op_længde <* operation for radio_adm *> + 2*(data + 64) <* operationer for radio_ind/-ud *> + max_netto_op; :4: radio erklæringer \f message procedure radio_erklæringer side 1 - 820304/hko; zone z_fr_in(14,1,rad_in_fejl), z_rf_in(14,1,rad_in_fejl), z_fr_out(14,1,rad_out_fejl), z_rf_out(14,1,rad_out_fejl); integer array radiofejl, ss_samtale_nedlagt, ss_radio_aktiver(1:max_antal_kanaler), bs_talevej_udkoblet, cs_radio(1:max_antal_taleveje), radio_linietabel(1:max_linienr//3+1), radio_områdetabel(0:max_antal_områder), opkaldskø(opkaldskø_postlængde//2+1: (max_antal_mobilopkald+1)*opkaldskø_postlængde//2), kanal_tab(1:max_antal_kanaler*kanal_beskr_længde//2), hookoff_maske(1:(tv_maske_lgd//2)), samtaleflag, kanalflag, opkaldsflag(1:(op_maske_lgd//2)); integer field kanal_tilstand, kanal_id1, kanal_id2, kanal_spec, kanal_alt_id1, kanal_alt_id2; integer array field kanal_mon_maske, kanal_alarm, opkald_meldt; integer cs_rad, cs_radio_medd, cs_radio_adm, cs_radio_ind, cs_radio_ud, cs_radio_pulje, cs_radio_kø, bs_mobil_opkald, bs_opkaldskø_adgang, opkaldskø_ledige, nødopkald_brugt, første_frie_opkald, første_opkald, sidste_opkald, første_nødopkald, sidste_nødopkald, optaget_flag; boolean mobil_opkald_aktiveret; \f message procedure læs_hex_ciffer side 1 - 810428/hko; integer procedure læs_hex_ciffer(tabel,linie,op); value linie; integer array tabel; integer linie,op; begin integer i,j; i:=(if linie>=0 then linie+6 else linie)//6; j:=((i-1)*6-linie)*4; læs_hex_ciffer:=op:=tabel(i) shift j extract 4; end læs_hex_ciffer; message procedure sæt_hex_ciffer side 1 - 810505/hko; integer procedure sæt_hex_ciffer(tabel,linie,op); value linie; integer array tabel; integer linie,op; begin integer i,j; i:=(if linie>=0 then linie+6 else linie)//6; j:=(linie-(i-1)*6)*4; sæt_hex_ciffer:= tabel(i) shift (-j) extract 4; tabel(i):=tabel(i) shift (-4-j) shift 4 add (op extract 4) shift j add (tabel(i) extract j); end sæt_hex_ciffer; message procedure hex_to_dec side 1 - 900108/cl; integer procedure hex_to_dec(hex); value hex; integer hex; begin hex_to_dec:= if 'A'<=hex and hex<='F' then (hex-'A'+10) else (hex-'0'); end; message procedure dec_to_hex side 1 - 900108/cl; integer procedure dec_to_hex(dec); value dec; integer dec; begin dec_to_hex:= if 0<=dec and dec<=9 then ('0'+dec) else ('A'+dec-10); end; message procedure rad_out_fejl side 1 - 820304/hko; procedure rad_out_fejl(z,s,b); value s; zone z; integer s,b; begin integer array field iaf; integer pos,tegn,max,i; integer array ia(1:20); long array field laf; disable begin laf:= iaf:= 2; tegn:= 1; getzone6(z,ia); max:= ia(16)//2*3; if s = 1 shift 21 + 2 then begin z(1):= real<:<'em'>:>; b:= 2; end else begin pos:= 0; for i:= 1 step 1 until max_antal_kanaler do begin iaf:= (i-1)*kanalbeskr_længde; if sæt_hex_ciffer(kanal_tab.iaf,3,15)<>15 then pos:= pos+1; if pos>0 then begin tofrom(kanalflag,alle_operatører,op_maske_lgd); signalbin(bs_mobilopkald); fejlreaktion(17<*y.e.status*>,s,string ia.laf(increase(tegn)), 1 shift 12<*binært*> +1<*fortsæt*>); end; end; end; end; end; \f message procedure rad_in_fejl side 1 - 810601/hko; procedure rad_in_fejl(z,s,b); value s; zone z; integer s,b; begin integer array field iaf; integer pos,tegn,max,i; integer array ia(1:20); long array field laf; disable begin laf:= iaf:= 2; i:= 1; getzone6(z,ia); max:= ia(16)//2*3; if s shift (-21) extract 1 = 0 and s shift(-19) extract 1 = 0 then begin if b = 0 then begin z(1):= real<:!:>; b:= 2; end; end; \f message procedure rad_in_fejl side 2 - 820304/hko; if (s <> 1 shift 21 +2 and s shift(-19) extract 1 = 0) then begin fejlreaktion(17<*ydre enhed status*>,s,string ia.laf(increase(i)), 1 shift 12<*binær*> +1<*fortsæt*>); end else if s shift (-19) extract 1 = 1 then begin z(1):= real<:!<'nl'>:>; b:= 2; end else if s = 1 shift 21 +2 or s shift(-19) extract 1 =1 then begin <* if b = 0 then begin *> z(1):= real <:<'em'>:>; b:= 2; <* end else begin tegn:= -1; iaf:= 0; pos:= b//2*3-2; while pos < max and tegn <> 0 do læstegn(z.iaf,pos,tegn); skriv_tegn(z.iaf,pos,'?'); if pos<=max then afslut_text(z.iaf,pos); b:= (pos-1)//3*2; end; *> end;<* s=1 shift 21+2 *> end; if testbit22 and (s <> 1 shift 21 +2 and s shift(-19) extract 1 = 0) then delay(60); end rad_in_fejl; \f message procedure afvent_radioinput side 1 - 880901/cl; integer procedure afvent_radioinput(z_in,tlgr,rf); value rf; zone z_in; integer array tlgr; boolean rf; begin integer i, p, pos, tegn, ac, sum, csum, lgd; long array field laf; laf:= 0; pos:= 1; repeat i:=readchar(z_in,tegn); if i<>8 and pos<80 then skrivtegn(tlgr,pos,tegn); until (i=8 and pos>1) or (tegn='em') or (pos>=80); p:=pos; repeat afsluttext(tlgr,p) until p mod 6 = 1; <*+2*>if overvåget and (testbit36 or ((-,rf) and testbit38) or (rf and testbit39)) then disable begin write(zrl,<<zd dd dd.dd >,now, (if -,rf then <:fr-tlgr: :> else <:rf-answ: :>),tlgr.laf, if tegn='em' then <:*timeout*:> else if pos>=80 then <:*for langt*:> else <::>); outchar(zrl,'nl'); end; <*-2*> ac:= -1; if pos >= 80 then begin <* telegram for langt *> repeat readchar(z_in,tegn) until tegn='nl' or tegn='em'; end else if pos>1 and tegn='nl' then begin lgd:= 1; while læstegn(tlgr,lgd,tegn)<>0 do ; lgd:= lgd-2; if lgd >= 5 then begin lgd:= lgd-2; <* se bort fra checksum *> i:= lgd + 1; csum:= (læstegn(tlgr,i,tegn) - '@')*16; csum:= csum + (læstegn(tlgr,i,tegn) - '@'); i:= lgd + 1; skrivtegn(tlgr,i,0); skrivtegn(tlgr,i,0); i:= 1; sum:= 0; while i <= lgd do sum:= (sum + læstegn(tlgr,i,tegn)) mod 256; if csum >= 0 and csum <> sum then begin <*+2*> if overvåget and (testbit36 or ((-,rf) and testbit38) or (rf and testbit39)) then disable begin write(zrl,<<zd dd dd.dd >,now, (if rf then <:rf:> else <:fr:>), <:-tlgr-checksumfejl: :>,csum,sum); outchar(zrl,'nl'); end; <*-2*> ac:= 6 <* checksumfejl *> end else ac:= 0; end else ac:= 6; <* for kort telegram - retransmitter *> end; afvent_radioinput:= ac; end; \f message procedure skriv_kanal_tab side 1 - 820304/hko; procedure skriv_kanal_tab(z); zone z; begin integer array field ref; integer i,j,t,op,id1,id2; write(z,"ff",1,"nl",1,<: ******** kanal-beskrivelser ******* a k l p m b n l a y a o s ø nr tv tilst + * l t t s n v d - type id1 id2 ttmm/ant -ej.op:>, <* 01 ..... ..... x x x x x x x x x x .... ........ ........ .... .... ---- *> "nl",1); for i:=1 step 1 until max_antal_kanaler do begin ref:=(i-1)*kanal_beskr_længde; t:=kanal_tab.ref.kanal_tilstand; id1:=kanal_tab.ref.kanal_id1; id2:=kanal_tab.ref.kanal_id2; write(z,"nl",1,"sp",4, <<dd>,i,<<-ddddd>,t shift(-16),t shift(-12) extract 4,"sp",1); for j:=11 step -1 until 2 do write(z,if læsbit_i(t,j) then "X" else "sp",1,"sp",1); write(z,case t extract 2 +1 of (<:- :>,<:OPK :>,<:MEDD:>,<:GNM :>), "sp",1); skriv_id(z,id1,9); skriv_id(z,id2,9); t:=kanal_tab.ref.kanal_spec; write(z,"sp",1,<<-dddd>,t,t shift(-16),"sp",1,-(t extract 8)); write(z,"nl",1,"sp",14,<:mon: :>); for j:= max_antal_taleveje step -1 until 1 do write(z,(if læs_bit_ia(kanal_tab.ref.kanal_mon_maske,j) then "1" else "."),1); write(z,"sp",25-max_antal_taleveje); skriv_id(z,kanal_tab.ref.kanal_alt_id1,9); skriv_id(z,kanal_tab.ref.kanal_alt_id2,9); end; write(z,"nl",2,<:kanalflag::>,"nl",1); outintbits_ia(z,kanalflag,1,op_maske_lgd//2); write(z,"nl",2); end skriv_kanal_tab; \f message procedure skriv_opkaldskø side 1 - 820301/hko; procedure skriv_opkaldskø(z); zone z; begin integer i,bogst,løb,j; integer array field ref; write(z,"nl",2,"*",5,<: opkaldskø :>,"*",5,"nl",2, <: ref næste foreg X bus linie/løb tid - op type :>, <: sig omr :>,"nl",1); for i:= 1 step 1 until max_antal_mobilopkald do begin ref:= i*opkaldskø_postlængde; j:= opkaldskø.ref(1); write(z,<< dddd>,ref,<< ddddd>,j extract 12,j shift (-12)); j:= opkaldskø.ref(2); write(z,"sp",1,if j < 0 then "X" else "sp",1,"sp",1); skriv_id(z,j extract 23,9); j:= opkaldskø.ref(3); skriv_id(z,j,7); j:= opkaldskø.ref(4); write(z,<< zd.dd>,(j shift (-12))/100.0, << zd>,j extract 8); j:= j shift (-8) extract 4; if j = 1 or j = 2 then write(z,if j=1 then <: normal:> else <: nød :>) else write(z,<<dddd>,j,"sp",3); j:= opkaldskø.ref(5); write(z,if j shift (-20) <> 0 then <: B :> else <: S :>, true,4,if 1<=(j extract 8) and (j extract 8)<=max_antal_områder then string område_navn(j extract 8) else <:---:>); outchar(z,'nl'); end; write(z,"nl",1,<<z>, <:første_frie_opkald=:>,første_frie_opkald,"nl",1, <:første_opkald=:>,første_opkald,"nl",1, <:sidste_opkald=:>,sidste_opkald,"nl",1, <:første_nødopkald=:>,første_nødopkald,"nl",1, <:sidste_nødopkald=:>,sidste_nødopkald,"nl",1, <:opkaldskø_ledige=:>,opkaldskø_ledige,"nl",1, <:nødopkald_brugt= :>,nødopkald_brugt,"nl",1, "nl",1,<:opkaldsflag::>,"nl",1); outintbits_ia(z,opkaldsflag,1,op_maske_lgd//2); write(z,"nl",2); end skriv_opkaldskø; \f message procedure skriv_radio_linietabel side 1 - 820301/hko; procedure skriv_radio_linie_tabel(z); zone z; begin integer i,j,k; write(z,"nl",2,"*",5,<: liniefordeling for operatører :>,"*",5,"nl",2); k:= 0; for i:= 1 step 1 until max_linienr do begin læstegn(radio_linietabel,i+1,j); if j > 0 then begin k:= k +1; write(z,<<dddd>,i,":",1,<<zd_>,j,"sp",if k mod 5=0 then 0 else 4, "nl",if k mod 5=0 then 1 else 0); end; end; write(z,"nl",if k mod 5=0 then 1 else 2); end skriv_radio_linietabel; procedure skriv_radio_områdetabel(z); zone z; begin integer i; write(z,"nl",2,"*",5,<: områdefordeling for operatører :>,"*",5,"nl",2); for i:= 1 step 1 until max_antal_områder do begin laf:= (i-1)*4; if radio_områdetabel(i)<>0 then write(z,<<dd>,i,<:. :>,områdenavn.laf,<:: :>, radio_områdetabel(i),"nl",1); end; end skriv_radio_områdetabel; \f message procedure h_radio side 1 - 810520/hko; <* hovedmodulkorutine for radiokanaler *> procedure h_radio; begin integer array field op_ref; integer k,dest_sem; procedure skriv_hradio(z,omfang); value omfang; zone z; integer omfang; begin integer i; disable i:= write(z,"nl",1,<:+++ hovedmodul radio:>); write(z,"sp",26-i); if omfang >0 then disable begin integer x; trap(slut); write(z,"nl",1, <: op_ref: :>,op_ref,"nl",1, <: k: :>,k,"nl",1, <: dest_sem: :>,dest_sem,"nl",1, <::>); skriv_coru(z,coru_no(400)); slut: end; end skriv_hradio; trap(hrad_trap); stack_claim(if cm_test then 198 else 146); <*+2*> if testbit32 and overvåget or testbit28 then skriv_hradio(out,0); <*-2*> \f message procedure h_radio side 2 - 820304/hko; repeat wait_ch(cs_rad,op_ref,true,-1); <*+2*>if testbit33 and overvåget then disable begin skriv_h_radio(out,0); write(out,<: operation modtaget:>); skriv_op(out,op_ref); end; <*-2*> <*+4*> if (d.op_ref.optype and (gen_optype or rad_optype or vt_optype)) extract 12 =0 then fejlreaktion(12<*operationstype*>,op_ref,<:h<'_'>radio:>,1); <*-4*> k:=d.op_ref.op_kode extract 12; dest_sem:= if k > 0 and k < 7 or k=11 or k=12 or k=19 or (72<=k and k<=74) or k = 77 <*IN,O/EK,O/IN,R/EK,R/FO,L/ST/EK,K/IN,K/RA,I/FO,O*> then cs_radio_adm else if k=41 <* radiokommando fra operatør *> then cs_radio(d.opref.data(1)) else -1; <*+4*> if dest_sem<1 then begin if dest_sem<0 then fejlreaktion(2<*operationskode*>,k,<:hovedmodul radio:>,1); d.op_ref.resultat:= if dest_sem=0 then 45 else 31; signal_ch(d.op_ref.retur,op_ref,d.op_ref.optype); end else <*-4*> begin <* operationskode ok *> signal_ch(dest_sem,op_ref,d.op_ref.optype); end; until false; hrad_trap: disable skriv_hradio(zbillede,1); end h_radio; \f message procedure radio side 1 - 820301/hko; procedure radio(talevej,op); value talevej,op; integer talevej,op; begin integer array field opref, rad_op, vt_op, opref1, iaf, iaf1; integer nr,i,j,k,res,opgave,tilst,tekn_inf, vtop2, vtop3, sig,omr,type,bus,ll,ttmm,vogn,garage,operatør; integer array felt,værdi(1:8); boolean byt,nød,frigiv_samtale; real kl; real field rf; procedure skriv_radio(z,omfang); value omfang; zone z; integer omfang; begin integer i1; disable i1:= write(z,"nl",1,<:+++ radio:>); write(z,"sp",26-i1); if omfang > 0 then disable begin real x; trap(slut); \f message procedure radio side 1a- 820301/hko; write(z,"nl",1, <: op_ref: :>,op_ref,"nl",1, <: opref1: :>,opref1,"nl",1, <: iaf: :>,iaf,"nl",1, <: iaf1: :>,iaf1,"nl",1, <: vt-op: :>,vt_op,"nl",1, <: rad-op: :>,rad_op,"nl",1, <: rf: :>,rf,"nl",1, <: nr: :>,nr,"nl",1, <: i: :>,i,"nl",1, <: j: :>,j,"nl",1, <: k: :>,k,"nl",1, <: operatør: :>,operatør,"nl",1, <: tilst: :>,tilst,"nl",1, <: res: :>,res,"nl",1, <: opgave: :>,opgave,"nl",1, <: type: :>,type,"nl",1, <: bus: :>,bus,"nl",1, <: ll: :>,ll,"nl",1, <: ttmm: :>,ttmm,"nl",1, <: vogn: :>,vogn,"nl",1, <: tekn-inf: :>,tekn_inf,"nl",1, <: vtop2: :>,vtop2,"nl",1, <: vtop3: :>,vtop3,"nl",1, <: sig: :>,sig,"nl",1, <: omr: :>,omr,"nl",1, <: garage: :>,garage,"nl",1, <<-dddddd'-dd>, <: kl: :>,kl,systime(4,kl,x),x,"nl",1, <:samtaleflag: :>,"nl",1); out_intbits_ia(z,samtaleflag,1,op_maske_lgd//2); skriv_coru(z,coru_no(410+talevej)); slut: end;<*disable*> end skriv_radio; \f message procedure udtag_opkald side 1 - 820301/hko; integer procedure udtag_opkald(vogn,type,operatør,bus,garage,omr,sig,ll,ttmm); value vogn, operatør; integer vogn,type,operatør,bus,garage,omr,sig,ll,ttmm; begin integer res,tilst,nr,i,j,t,o,b,l,tm; integer array field vt_op,ref,næste,forrige; integer array field iaf1; boolean skal_ud; boolean procedure skal_udskrives(fordelt,aktuel); value fordelt,aktuel; integer fordelt,aktuel; begin boolean skal; integer n; integer array field iaf; skal:= true; if fordelt > 0 and fordelt<>aktuel then begin for n:= 0 step 1 until 3 do begin if bpl_tilst(operatør_stop(fordelt,n),1) > 0 then begin iaf:= operatør_stop(fordelt,n)*op_maske_lgd; skal:= læsbit_ia(bpl_def.iaf,aktuel); goto returner; end; end; end; returner: skal_udskrives:= skal; end; l:= b:= tm:= t:= 0; garage:= sig:= 0; res:= -1; <*V*> wait(bs_opkaldskø_adgang); ref:= første_nødopkald; if ref <> 0 then t:= 2 else begin ref:= første_opkald; t:= if ref = 0 then 0 else 1; end; if t = 0 then res:= +19 <*kø er tom*> else if vogn=0 and omr=0 then begin while ref <> 0 and res = -1 do begin nr:= opkaldskø.ref(4) extract 8; if nr>64 then begin <*opk. primærfordelt til gruppe af btj.pl.*> i:=0; skal_ud:=true; iaf1:=nr*op_maske_lgd; while skal_ud and i<max_antal_operatører do begin i:=i+1; if læsbit_ia(bpl_def.iaf1,i) then skal_ud:= skal_ud and skal_udskrives(i,operatør); end; end else skal_ud:= skal_udskrives(nr,operatør); if skal_ud then <* if nr=0 or -,læsbit_ia(operatørmaske,nr) or nr=operatør then *> res:= 0 else begin ref:= opkaldskø.ref(1) extract 12; if ref = 0 and t = 2 then begin ref:= første_opkald; t:= if ref = 0 then 0 else 1; end else if ref = 0 then t:= 0; end; end; <*while*> \f message procedure udtag_opkald side 2 - 820304/hko; if ref <> 0 then begin b:= opkaldskø.ref(2); <*+4*> if b < 0 then fejlreaktion(19<*mobilopkald*>,bus extract 14, <:nødopkald(besvaret/ej meldt):>,1); <*-4*> garage:=b shift(-14) extract 8; b:= b extract 14; l:= opkaldskø.ref(3); tm:= opkaldskø.ref(4); o:= tm extract 8; tm:= tm shift(-12); omr:= opkaldskø.ref(5) extract 8; sig:= opkaldskø.ref(5) shift (-20); end else res:=19; <* kø er tom *> end <*vogn=0 and omr=0 *> else begin <* vogn<>0 or omr<>0 *> i:= 0; tilst:= -1; if vogn shift(-22) = 1 then begin i:= find_busnr(vogn,nr,garage,tilst); l:= vogn; end else if vogn<>0 and (omr=0 or omr>2) then begin o:= 0; i:= søg_omr_bus(vogn,l,garage,o,sig,tilst); if i=(-2) then begin o:= omr; i:= søg_omr_bus(vogn,l,garage,o,sig,tilst); end; nr:= vogn extract 14; end else nr:= vogn extract 14; if i<0 then ref:= 0; while ref <> 0 and res = -1 do begin i:= opkaldskø.ref(2) extract 14; j:= opkaldskø.ref(4) extract 8; <*operatør*> if nr = i and (omr=0 or omr=opkaldskø.ref(5) extract 8) then res:= 0 else begin ref:= opkaldskø.ref(1) extract 12; if ref = 0 and t = 2 then begin ref:= første_opkald; t:= if ref = 0 then 0 else 1; end else if ref = 0 then t:= 0; end; end; <*while*> \f message procedure udtag_opkald side 3 - 810603/hko; if ref <> 0 then begin b:= nr; tm:= opkaldskø.ref(4); o:= tm extract 8; tm:= tm shift(-12); omr:= opkaldskø.ref(5) extract 4; sig:= opkaldskø.ref(5) shift (-20); <*+4*> if tilst <> -1 then fejlreaktion(3<*prg.fejl*>,tilst, <:vogntabel_tilstand for vogn i kø:>,1); <*-4*> end; end; if ref <> 0 then begin næste:= opkaldskø.ref(1); forrige:= næste shift(-12); næste:= næste extract 12; if forrige <> 0 then opkaldskø.forrige(1):= opkaldskø.forrige(1) shift(-12) shift 12 + næste else if t = 1 then første_opkald:= næste else <*if t = 2 then*> første_nødopkald:= næste; if næste <> 0 then opkaldskø.næste(1):= opkaldskø.næste(1) extract 12 + forrige shift 12 else if t = 1 then sidste_opkald:= forrige else <* if t = 2 then*> sidste_nødopkald:= forrige; opkaldskø.ref(1):=første_frie_opkald; første_frie_opkald:=ref; opkaldskø_ledige:=opkaldskø_ledige + 1; if t=2 then nødopkald_brugt:=nødopkald_brugt - 1; if -,læsbit_ia(operatør_maske,o) or o = 0 then tofrom(opkaldsflag,alle_operatører,op_maske_lgd) else begin sætbit_ia(opkaldsflag,operatør,1); sætbit_ia(opkaldsflag,o,1); end; signal_bin(bs_mobil_opkald); end; \f message procedure udtag_opkald side 4 - 810531/hko; signal_bin(bs_opkaldskø_adgang); bus:= b; type:= t; ll:= l; ttmm:= tm; udtag_opkald:= res; end udtag opkald; \f message procedure frigiv_kanal side 1 - 810603/hko; procedure frigiv_kanal(nr); value nr; integer nr; begin integer id1, id2, omr, i; integer array field iaf, vt_op; iaf:= (nr-1)*kanal_beskrlængde; id1:= kanal_tab.iaf.kanal_id1; id2:= kanal_tab.iaf.kanal_id2; omr:= kanal_til_omr(nr); if id1 <> 0 then wait(ss_samtale_nedlagt(nr)); if id1 shift (-22) < 3 and omr > 2 then begin <*V*> waitch(cs_vt_adgang,vt_op,true,-1); start_operation(vt_op,410+talevej,cs_radio(talevej), if id1 shift (-22) = 2 then 18 else 17); d.vt_op.data(1):= id1; d.vt_op.data(4):= omr; signalch(cs_vt,vt_op,vt_optype or genoptype); <*V*> waitch(cs_radio(talevej),vt_op,vt_optype,-1); signalch(cs_vt_adgang,vt_op,true); end; if id2 <> 0 and id2 shift(-20) <> 12 then wait(ss_samtale_nedlagt(nr)); if id2 shift (-22) < 3 and omr > 2 then begin <*V*> waitch(cs_vt_adgang,vt_op,true,-1); start_operation(vt_op,410+talevej,cs_radio(talevej), if id2 shift (-22) = 2 then 18 else 17); d.vt_op.data(1):= id2; d.vt_op.data(4):= omr; signalch(cs_vt,vt_op,vt_optype or genoptype); <*V*> waitch(cs_radio(talevej),vt_op,vt_optype,-1); signalch(cs_vt_adgang,vt_op,true); end; kanal_tab.iaf.kanal_id1:= kanal_tab.iaf.kanal_id2:= kanal_tab.iaf.kanal_alt_id1:= kanal_tab.iaf.kanal_alt_id2:= 0; kanal_tab.iaf.kanal_tilstand:= kanal_tab.iaf.kanal_tilstand shift (-10) extract 6 shift 10; <* repeat inspect(ss_samtale_nedlagt(nr),i); if i>0 then wait(ss_samtale_nedlagt(nr)); until i<=0; *> end frigiv_kanal; \f message procedure hookoff side 1 - 880901/cl; integer procedure hookoff(talevej,op,retursem,flash); value talevej,op,retursem,flash; integer talevej,op,retursem; boolean flash; begin integer array field opref; opref:= op; start_operation(opref,410+talevej,retursem,'A' shift 12 + 60); d.opref.data(1):= talevej; d.opref.data(2):= if flash then 2 else 1; signalch(cs_radio_ud,opref,rad_optype); <*V*> waitch(retursem,opref,rad_optype,-1); hookoff:= d.opref.resultat; end; \f message procedure hookon side 1 - 880901/cl; integer procedure hookon(talevej,op,retursem); value talevej,op,retursem; integer talevej,op,retursem; begin integer i,res; integer array field opref; if læsbit_ia(hookoff_maske,talevej) then begin inspect(bs_talevej_udkoblet(talevej),i); if i<=0 then begin opref:= op; start_operation(opref,410+talevej,retursem,'D' shift 12 + 60); d.opref.data(1):= talevej; signalch(cs_radio_ud,opref,rad_optype); <*V*> waitch(retursem,opref,rad_optype,-1); res:= d.opref.resultat; end else res:= 0; if res=0 then wait(bs_talevej_udkoblet(talevej)); end else res:= 0; sætbit_ia(hookoff_maske,talevej,0); hookon:= res; end; \f message procedure radio side 2 - 820304/hko; rad_op:= op; trap(radio_trap); stack_claim((if cm_test then 200 else 150) +200); <*+2*>if testbit32 and overvåget or testbit28 then skriv_radio(out,0); <*-2*> repeat waitch(cs_radio(talevej),opref,true,-1); <*+2*> if testbit33 and overvåget then disable begin skriv_radio(out,0); write(out,<: operation modtaget på cs:>,<<d>,cs_radio(talevej)); skriv_op(out,opref); end; <*-2*> k:= d.op_ref.opkode extract 12; opgave:= d.opref.opkode shift (-12); operatør:= d.op_ref.data(4); <*+4*> if (d.op_ref.optype and (gen_optype or io_optype or op_optype)) extract 12 = 0 then fejlreaktion(12<*operationstype*>,op_ref, <:radio:>,0); <*-4*> \f message procedure radio side 3 - 880930/cl; if k=41 <*radiokommando fra operatør*> then begin vogn:= d.opref.data(2); res:= -1; for i:= 7 step 1 until 12 do d.opref.data(i):= 0; sig:= 0; omr:= d.opref.data(3) extract 8; bus:= garage:= ll:= 0; if opgave=1 or opgave=9 then begin <* opkald til enkelt vogn (CHF) *> res:= udtag_opkald(vogn,type,operatør,bus,garage,omr,sig,ll,ttmm); if res=19 and (vogn<>0 or d.opref.data(3)=2) then res:= -1; <* ok at kø er tom når vogn er angivet eller VHF *> d.opref.data(11):= if res=0 then (if ll<>0 then ll else bus) else vogn; if type=2 <*nød*> then begin waitch(cs_radio_pulje,opref1,true,-1); start_operation(opref1,410+talevej,cs_radio_pulje,46); d.opref1.data(1):= if ll<>0 then ll else bus; systime(5,0,kl); d.opref1.data(2):= entier(kl/100.0); d.opref1.data(3):= omr; signalch(cs_io,opref1,gen_optype or rad_optype); end end; <* enkeltvogn (CHF) *> <* check enkeltvogn for ledig *> if res<=0 and omr=2<*VHF*> and bus=0 and (opgave=1 or opgave=9) then begin for i:= 1 step 1 until max_antal_kanaler do if kanal_til_omr(i)=2 then nr:= i; iaf:= (nr-1)*kanalbeskrlængde; if kanal_tab.iaf.kanal_tilstand extract 2<>0 and kanal_tab.iaf.kanal_id1 extract 20 = 10000 then res:= 52; end; if res < 0 and (d.opref.data(3) > 2 <* ej TLF, VHF *> or d.opref.data(3)=0 <*std. omr*>) and (opgave <= 2 <* OP elller ME *> or opgave = 9 <* OP,L *>) then begin type:= ttmm:= 0; omr:= 0; sig:= 0; if vogn shift (-22) = 1 then begin find_busnr(vogn,bus,garage,res); ll:= vogn; end else if vogn shift (-22) = 0 then begin søg_omr_bus(vogn,ll,garage,omr,sig,res); bus:= vogn; end else fejlreaktion(31,vogn,<:vognident i enkeltvognsopk.:>,0); res:= if res=(-1) then 18 <* i kø *> else (if res<>0 then 14 <*opt*> else 0); end else if res<0 and (d.opref.data(3)=1 or d.opref.data(3)=2) and opgave <= 2 then begin bus:= vogn; garage:= type:= ttmm:= 0; res:= 0; omr:= 0; sig:= 0; end else if opgave>1 and opgave<>9 then type:= ttmm:= res:= 0; \f message procedure radio side 4 - 880930/cl; if res=0 and (opgave<=4 or opgave=9) and (omr<1 or 2<omr) and (d.opref.data(3)>2 or d.opref.data(3)=0) then begin <* reserver i vogntabel *> waitch(cs_vt_adgang,vt_op,true,-1); start_operation(vt_op,410+talevej,cs_radio(talevej), if opgave <=2 or opgave=9 then 15 else 16); d.vt_op.data(1):= if opgave<=2 or opgave=9 then (if vogn=0 then garage shift 14 + bus else if ll<>0 then ll else garage shift 14 + bus) else vogn <*gruppeid*>; d.vt_op.data(4):= if d.opref.data(3)<>0 then d.opref.data(3) extract 8 else omr extract 8; signalch(cs_vt,vt_op,gen_optype or rad_optype); <*V*> waitch(cs_radio(talevej),vt_op,rad_optype,-1); res:= d.vt_op.resultat; if res=3 then res:= 0; vtop2:= d.vt_op.data(2); vtop3:= d.vt_op.data(3); tekn_inf:= d.vt_op.data(4); signalch(cs_vt_adgang,vt_op,gen_optype or vt_optype); end; if res<>0 then begin d.opref.resultat:= res; signalch(d.opref.retur,opref,d.opref.optype); end else if opgave <= 9 then begin <* opkald *> res:= hookoff(talevej,rad_op,cs_radio(talevej), opgave<>9 and d.opref.data(6)<>0); if res<>0 then goto returner_op; if opgave=7 or opgave=8 then <* KATASTROFEOPKALD *> begin start_operation(rad_op,410+talevej,cs_radio(talevej), 'H' shift 12 + 60); d.rad_op.data(1):= talevej; d.rad_op.data(2):= 'D'; d.rad_op.data(3):= 6; <* rear *> d.rad_op.data(4):= 1; <* rear no *> d.rad_op.data(5):= 0; <* disconnect *> signalch(cs_radio_ud,rad_op,rad_optype); <*V*> waitch(cs_radio(talevej),rad_op,rad_optype,-1); if d.rad_op.resultat<>0 then begin res:= d.rad_op.resultat; goto returner_op; end; <* while optaget_flag shift (-1) <> 0 do delay(1); *> end; \f message procedure radio side 5 - 880930/cl; start_operation(rad_op,410+talevej,cs_radio(talevej), 'B' shift 12 + 60); d.rad_op.data(1):= talevej; d.rad_op.data(2):= 'D'; d.rad_op.data(3):= if opgave=9 then 3 else (2 - (opgave extract 1)); <* højttalerkode *> if 5<=opgave and opgave <=8 then <* ALLE KALD *> begin j:= 0; for i:= 2 step 1 until max_antal_områder do begin if opgave > 6 or (d.opref.data(3) shift (-20) = 15 and læsbiti(d.opref.data(3),i)) or (d.opref.data(3) shift (-20) = 14 and d.opref.data(3) extract 20 = i) then begin for k:= 1 step 1 until (if i=3 then 2 else 1) do begin j:= j+1; d.rad_op.data(10+(j-1)*2):= område_id(i,2) shift 12 + <* tkt, tkn *> (if i=2<*VHF*> then 4 else k) shift 8 + <* signal type *> 1; <* antal tno *> d.rad_op.data(11+(j-1)*2):= 0; <* tno alle *> end; end; end; d.rad_op.data(4):= j; d.rad_op.data(5):= 0; end else if opgave>2 and opgave <= 4 then <* gruppekald *> begin d.rad_op.data(4):= vtop2; d.rad_op.data(5):= vtop3; end else begin <* enkeltvogn *> if omr=0 then begin sig:= tekn_inf shift (-23); omr:= if d.opref.data(3)<>0 then d.opref.data(3) else tekn_inf extract 8; end else if d.opref.data(3)<>0 then omr:= d.opref.data(3); <* lytte-kald til nød i TCT, VHF og TLF *> <* tvinges til alm. opkald *> if (opgave=9) and (type=2) and (omr<=3) then begin d.opref.opkode:= 1 shift 12 + d.opref.opkode extract 12; opgave:= 1; d.radop.data(3):= 1; end; if omr=2 <*VHF*> then sig:= 4 else if omr=1 <*TLF*> then sig:= 7 else <*UHF*> sig:= sig+1; d.rad_op.data(4):= 1; d.rad_op.data(5):= 0; d.rad_op.data(10):= (område_id(omr,2) extract 12) shift 12 + sig shift 8 + 1; d.rad_op.data(11):= bus; end; \f message procedure radio side 6 - 880930/cl; signalch(cs_radio_ud,rad_op,rad_optype); <*V*> waitch(cs_radio(talevej),rad_op,rad_optype,-1); res:= d.rad_op.resultat; d.rad_op.data(6):= 0; for i:= 1 step 1 until max_antal_områder do if læsbiti(d.rad_op.data(7),i) then increase(d.rad_op.data(6)); returner_op: if d.rad_op.data(6)=1 then begin for i:= 1 step 1 until max_antal_områder do if d.rad_op.data(7) extract 20 = 1 shift i then d.opref.data(12):= 14 shift 20 + i; end else d.opref.data(12):= 15 shift 20 + d.rad_op.data(7) extract 20; d.opref.data(7):= type; d.opref.data(8):= garage shift 14 + bus; d.opref.data(9):= ll; if res=0 then begin d.opref.resultat:= 3; d.opref.data(5):= d.opref.data(6); j:= 0; for i:= 1 step 1 until max_antal_kanaler do if læsbiti(d.rad_op.data(9),i) then j:= j+1; if j>1 then d.opref.data(6):= 3 shift 22 + 1 shift 20 + d.rad_op.data(9) else begin j:= 0; for i:= 1 step 1 until max_antal_kanaler do if læsbiti(d.rad_op.data(9),i) then j:= i; d.opref.data(6):= 3 shift 22 + j; end; d.opref.data(7):= type; d.opref.data(8):= garage shift 14 + bus; d.opref.data(9):= ll; d.opref.data(10):= d.opref.data(6); for i:= 1 step 1 until max_antal_kanaler do begin if læsbiti(d.rad_op.data(9),i) then begin if kanal_id(i) shift (-5) extract 5 = 2 then j:= pabx_id( kanal_id(i) extract 5 ) else j:= radio_id( kanal_id(i) extract 5 ); if j>0 and type=0 and operatør>0 then tæl_opkald(j,1); iaf:= (i-1)*kanalbeskrlængde; skrivtegn(kanal_tab.iaf,1,talevej); kanal_tab.iaf.kanal_id2:= kanal_tab.iaf.kanal_id1; kanal_tab.iaf.kanal_alt_id2:= kanal_tab.iaf.kanal_alt_id1; kanal_tab.iaf.kanal_id1:= if opgave<=2 or opgave=9 then d.opref.data(if d.opref.data(9)<>0 then 9 else 8) else d.opref.data(2); kanal_tab.iaf.kanal_alt_id1:= if opgave<=2 or opgave=9 then d.opref.data(if d.opref.data(9)<>0 then 8 else 9) else 0; if kanal_tab.iaf.kanal_id1=0 then kanal_tab.iaf.kanal_id1:= 10000; kanal_tab.iaf.kanal_spec:= if opgave <= 2 or opgave = 9 then ttmm else 0; end; end; if 5<=opgave and opgave<=8 <*alle-/katastrofekald*> then sætbit_ia(kanalflag,operatør,1); \f message procedure radio side 7 - 880930/cl; end else begin d.opref.resultat:= res; if res=20 or res=52 then begin <* tæl ej.forb og opt.kanal *> for i:= 1 step 1 until max_antal_områder do if læsbiti(d.rad_op.data(7),i) then tæl_opkald(i,(if res=20 then 4 else 5)); end; if d.opref.data(6)=0 then res:= hookon(talevej,rad_op,cs_radio(talevej)); <* frigiv fra vogntabel hvis reserveret *> if (opgave<=4 or opgave=9) and (d.opref.data(3)=0 or d.opref.data(3)>2) then begin waitch(cs_vt_adgang,vt_op,true,-1); startoperation(vt_op,410+talevej,cs_radio(talevej), if opgave<=2 or opgave=9 then 17 else 18); d.vt_op.data(1):= if opgave<=2 or opgave=9 then (if vogn=0 then garage shift 14 + bus else if ll<>0 then ll else garage shift 14 + bus) else vogn; d.vt_op.data(4):= omr; signalch(cs_vt,vt_op,gen_optype or vt_optype); waitch(cs_radio(talevej),vt_op,vt_optype,-1); signalch(cs_vt_adgang,vt_op,true); end; end; signalch(d.opref.retur,opref,d.opref.optype); \f message procedure radio side 8 - 880930/cl; end <* opkald *> else if opgave = 10 <* MONITER *> then begin nr:= d.opref.data(2); if nr shift (-20) <> 12 then fejlreaktion(3,nr,<: moniter, kanalnr:>,0); nr:= nr extract 20; iaf:= (nr-1)*kanalbeskrlængde; inspect(ss_samtale_nedlagt(nr),i); k:= if kanal_tab.iaf.kanal_id2 shift (-20) = 12 then kanal_tab.iaf.kanal_id2 extract 20 else if kanal_tab.iaf.kanal_id2<>0 then nr else 0; if k<>0 then inspect(ss_samtale_nedlagt(k),j) else j:=0; if kanal_tab.iaf.kanal_tilstand shift (-16) = talevej and (i<>0 or j<>0) then begin res:= 0; d.opref.data(5):= 12 shift 20 + k; d.opref.data(6):= 12 shift 20 + nr; sætbit_ia(kanalflag,operatør,1); goto radio_nedlæg; end else if i<>0 or j<>0 then res:= 49 else if kanal_tab.iaf.kanal_tilstand extract 2 = 0 then res:= 49 <* ingen samtale igang *> else begin res:= hookoff(talevej,rad_op,cs_radio(talevej),false); if res=0 then begin start_operation(rad_op,410+talevej,cs_radio(talevej), 'B' shift 12 + 60); d.rad_op.data(1):= talevej; d.rad_op.data(2):= 'V'; d.rad_op.data(3):= 0; d.rad_op.data(4):= 1; d.rad_op.data(5):= 0; d.rad_op.data(10):= (kanal_id(nr) shift (-5) shift 18) + (kanal_id(nr) extract 5 shift 12) + 0; signalch(cs_radio_ud,rad_op,rad_optype); <*V*> waitch(cs_radio(talevej),rad_op,rad_optype,-1); res:= d.rad_op.resultat; if res=0 then begin d.opref.data(5):= 0; d.opref.data(6):= 3 shift 22 + 0 shift 20 + nr; d.opref.data(7):= kanal_tab.iaf.kanal_tilstand extract 10; res:= 3; end; end; end; \f message procedure radio side 9 - 880930/cl; if res=3 then begin if kanal_tab.iaf.kanal_tilstand shift (-16) = talevej then sætbiti(kanal_tab.iaf.kanal_tilstand,5,1) <* monbit *> else sætbit_ia(kanal_tab.iaf.kanal_mon_maske,talevej,1); d.opref.data(6):= 12 shift 20 + nr; i:= kanal_tab.iaf.kanal_id2; if i<>0 then begin if i shift (-20) = 12 then begin <* ident2 henviser til anden kanal *> iaf1:= ((i extract 20)-1)*kanalbeskrlængde; if kanal_tab.iaf1.kanal_tilstand shift (-16) = talevej then sætbiti(kanal_tab.iaf.kanal_tilstand,5,1) else sætbit_ia(kanal_tab.iaf.kanal_mon_maske,talevej,1); d.opref.data(5):= 12 shift 20 + i; end else d.opref.data(5):= 12 shift 20 + nr; end else d.opref.data(5):= 0; end; if res<>3 then begin res:= 0; sætbit_ia(kanalflag,operatør,1); goto radio_nedlæg; end; d.opref.resultat:= res; signalch(d.opref.retur,opref,d.opref.optype); \f message procedure radio side 10 - 880930/cl; end <* MONITERING *> else if opgave = 11 then <* GENNEMSTILLING *> begin nr:= d.opref.data(6) extract 20; k:= if d.opref.data(5) shift (-20) = 12 then d.opref.data(5) extract 20 else 0; inspect(ss_samtale_nedlagt(nr),i); if k<>0 then inspect(ss_samtale_nedlagt(k),j) else j:=0; if i<>0 and j<>0 then begin res:= hookon(talevej,rad_op,cs_radio(talevej)); goto radio_nedlæg; end; iaf:= (nr-1)*kanal_beskr_længde; if kanal_tab.iaf.kanal_tilstand shift (-16) = talevej then begin if læsbiti(kanal_tab.iaf.kanal_tilstand,5) and kanal_tab.iaf.kanal_tilstand extract 2 = 3 then res:= hookoff(talevej,rad_op,cs_radio(talevej),true) else if kanal_tab.iaf.kanal_tilstand extract 2 = 1 and d.opref.data(5)<>0 then res:= 0 else res:= 21; <* ingen at gennemstille til *> end else res:= 50; <* kanalnr *> if res=0 then res:= hookon(talevej,rad_op,cs_radio(talevej)); if res=0 then begin sætbiti(kanal_tab.iaf.kanal_tilstand,5,0); kanal_tab.iaf.kanal_tilstand:= kanal_tab.iaf.kanal_tilstand shift (-2) shift 2 + 3; d.opref.data(6):= 0; if kanal_tab.iaf.kanal_id2=0 then kanal_tab.iaf.kanal_id2:= d.opref.data(5); if kanal_tab.iaf.kanal_id2 shift (-22) = 3 then begin <* gennemstillet til anden kanal *> iaf1:= ((kanal_tab.iaf.kanal_id2 extract 20) - 1) *kanalbeskrlængde; sætbiti(kanal_tab.iaf1.kanal_tilstand,5,0); kanal_tab.iaf1.kanal_tilstand:= kanal_tab.iaf1.kanal_tilstand shift (-2) shift 2 + 3; if kanal_tab.iaf1.kanal_id2=0 then kanal_tab.iaf1.kanal_id2:= 12 shift 20 + nr; end; d.opref.data(5):= 0; res:= 3; end; d.opref.resultat:= res; signalch(d.opref.retur,opref,d.opref.optype); \f message procedure radio side 11 - 880930/cl; end else if opgave = 12 then <* NEDLÆG *> begin res:= hookon(talevej,rad_op,cs_radio(talevej)); radio_nedlæg: if res=0 then begin for k:= 5, 6 do begin if d.opref.data(k) shift (-20) = 12 then begin i:= d.opref.data(k) extract 20; iaf:= (i-1)*kanalbeskrlængde; if kanal_tab.iaf.kanal_tilstand shift (-16) = talevej then frigiv_kanal(d.opref.data(k) extract 20) else sætbit_ia(kanal_tab.iaf.kanal_mon_maske,talevej,0); end else if d.opref.data(k) shift (-20) = 13 then begin for i:= 1 step 1 until max_antal_kanaler do if læsbiti(d.opref.data(k),i) then begin iaf:= (i-1)*kanalbeskrlængde; if kanal_tab.iaf.kanal_tilstand shift (-16) = talevej then frigiv_kanal(i) else sætbit_ia(kanal_tab.iaf.kanal_mon_maske,talevej,0); end; sætbit_ia(kanalflag,operatør,1); end; end; d.opref.data(5):= 0; d.opref.data(6):= 0; d.opref.data(9):= 0; res:= if opgave=12 then 3 else 49; end; d.opref.resultat:= res; signalch(d.opref.retur,opref,d.opref.optype); end else if opgave=13 then <* R *> begin startoperation(rad_op,410+talevej,cs_radio(talevej), 'H' shift 12 + 60); d.rad_op.data(1):= talevej; d.rad_op.data(2):= 'M'; d.rad_op.data(3):= 0; <*tkt*> d.rad_op.data(4):= 0; <*tkn*> d.rad_op.data(5):= 1 - (d.opref.data(2) extract 1); signalch(cs_radio_ud,rad_op,rad_optype); <*V*> waitch(cs_radio(talevej),rad_op,rad_optype,-1); res:= d.rad_op.resultat; d.opref.resultat:= if res=0 then 3 else res; signalch(d.opref.retur,opref,d.opref.optype); end else if opgave=14 <* VENTEPOS *> then begin res:= 0; while (res<=3 and d.opref.data(2)>0) do begin nr:= d.opref.data(6) extract 20; k:= if d.opref.data(5) shift (-20) = 12 then d.opref.data(5) extract 20 else 0; inspect(ss_samtale_nedlagt(nr),i); if k<>0 then inspect(ss_samtale_nedlagt(k),j) else j:= 0; if i<>0 or j<>0 then begin res:= hookon(talevej,radop,cs_radio(talevej)); goto radio_nedlæg; end; res:= hookoff(talevej,radop,cs_radio(talevej),true); if res=0 then begin i:= d.opref.data(5); d.opref.data(5):= d.opref.data(6); d.opref.data(6):= i; res:= 3; end; d.opref.data(2):= d.opref.data(2)-1; end; d.opref.resultat:= res; signalch(d.opref.retur,opref,d.opref.optype); end else begin fejlreaktion(2,opgave,<: radioopgave fra operatør:>,1); d.opref.resultat:= 31; signalch(d.opref.retur,opref,d.opref.optype); end; end <* radiokommando fra operatør *> else begin d.op_ref.resultat:= 45; <* ikke implementeret *> signal_ch(d.op_ref.retur,op_ref,d.op_ref.optype); end; until false; radio_trap: disable skriv_radio(zbillede,1); end radio; \f message procedure radio_ind side 1 - 810521/hko; procedure radio_ind(op); value op; integer op; begin integer array field op_ref,ref,io_opref; integer ac, lgd, ttyp, ptyp, pnum, pos, tegn, bs, b_pt, b_pn, antal_sendt, antal_spec, sum, csum, i, j, k, filref, zno; integer array typ, val(1:6), answ, tlgr(1:32); integer array field spec; real field rf; long array field laf; procedure skriv_radio_ind(zud,omfang); value omfang; zone zud; integer omfang; begin integer ii; disable ii:=write(zud,"nl",1,<:+++ radio-ind ::>); if omfang > 0 then disable begin integer x; long array field tx; tx:= 0; trap(slut); write(zud,"nl",1, <: op-ref: :>,op_ref,"nl",1, <: ref: :>,ref,"nl",1, <: io-opref: :>,io_opref,"nl",1, <: ac: :>,ac,"nl",1, <: lgd: :>,lgd,"nl",1, <: ttyp: :>,ttyp,"nl",1, <: ptyp: :>,ptyp,"nl",1, <: pnum: :>,pnum,"nl",1, <: pos: :>,pos,"nl",1, <: tegn: :>,tegn,"nl",1, <: bs: :>,bs,"nl",1, <: b-pt: :>,b_pt,"nl",1, <: b-pn: :>,b_pn,"nl",1, <: antal-sendt: :>,antal_sendt,"nl",1, <: antal-spec: :>,antal_spec,"nl",1, <: sum: :>,sum,"nl",1, <: csum: :>,csum,"nl",1, <: i: :>,i,"nl",1, <: j: :>,j,"nl",1, <: k: :>,k,"nl",1, <: filref :>,filref,"nl",1, <: zno: :>,zno,"nl",1, <: answ: :>,answ.tx,"nl",1, <: tlgr: :>,tlgr.tx,"nl",1, <: spec: :>,spec,"nl",1); trap(slut); slut: end; <*disable*> end skriv_radio_ind; \f message procedure indsæt_opkald side 1 - 811105/hko; integer procedure indsæt_opkald(bus,type,omr,sig); value bus,type,omr,sig; integer bus,type,omr,sig; begin integer res,tilst,ll,operatør; integer array field vt_op,ref,næste,forrige; real r; res:= -1; begin <*V*> waitch(cs_vt_adgang,vt_op,true,if type=2 then -1 else 10); if vt_op <> 0 then begin wait(bs_opkaldskø_adgang); if omr>2 then begin start_operation(vt_op,401,cs_radio_ind,14<*bus i kø*>); d.vt_op.data(1):= bus; d.vt_op.data(4):= omr; tilst:= vt_op; signal_ch(cs_vt,vt_op,gen_optype or vt_optype); <*V*> wait_ch(cs_radio_ind,vt_op,vt_optype,-1); <*+4*> if tilst <> vt_op then fejlreaktion(11<*fremmed post*>,vt_op,<:radio,indsæt opkald:>,0); <*-4*> <*+2*> if testbit34 and overvåget then disable begin write(out,"nl",1,<:radio_ind,indsæt.reservation retur:>); skriv_op(out,vt_op); ud; end; end else begin d.vt_op.data(1):= bus; d.vt_op.data(2):= 0; d.vt_op.data(3):= bus; d.vt_op.data(4):= omr; d.vt_op.resultat:= 0; ref:= første_nødopkald; if ref<>0 then tilst:= 2 else begin ref:= første_opkald; tilst:= if ref=0 then 0 else 1; end; if tilst=0 then d.vt_op.resultat:= 3 else begin while ref<>0 and d.vt_op.resultat=0 do begin if opkaldskø.ref(2) extract 14 = bus and opkaldskø.ref(5) extract 8 = omr then d.vt_op.resultat:= 18 else begin ref:= opkaldskø.ref(1) extract 12; if ref=0 and tilst=2 then begin ref:= første_opkald; tilst:= if ref=0 then 0 else 1; end else if ref=0 then tilst:= 0; end; end; if d.vt_op.resultat=0 then d.vt_op.resultat:= 3; end; end; <*-2*> \f message procedure indsæt_opkald side 1a- 820301/hko; if d.vt_op.resultat=18<*bus i kø*> and type=2<*nød*> then begin ref:=første_opkald; tilst:=-1; while ref<>0 and tilst=-1 do begin if opkaldskø.ref(2) extract 14 = bus extract 14 then begin <* udtag normalopkald *> næste:=opkaldskø.ref(1); forrige:=næste shift(-12); næste:=næste extract 12; if forrige<>0 then opkaldskø.forrige(1):= opkaldskø.forrige(1) shift(-12) shift 12 +næste else første_opkald:=næste; if næste<>0 then opkaldskø.næste(1):= opkaldskø.næste(1) extract 12 + forrige shift 12 else sidste_opkald:=forrige; opkaldskø.ref(1):=første_frie_opkald; første_frie_opkald:=ref; opkaldskø_ledige:=opkaldskø_ledige +1; tilst:=0; end else ref:=opkaldskø.ref(1) extract 12; end; <*while*> if tilst=0 then d.vt_op.resultat:=3; end; <*nødopkald bus i kø*> \f message procedure indsæt_opkald side 2 - 820304/hko; if d.vt_op.resultat = 3 then begin ll:= d.vt_op.data(2); tilst:= d.vt_op.data(3); læstegn(radio_linietabel,(ll shift (-12) extract 10)+1,operatør); if operatør < 0 or max_antal_operatører < operatør then operatør:= 0; if operatør=0 then operatør:= (tilst shift (-14) extract 8); if operatør=0 then operatør:= radio_områdetabel(d.vt_op.data(4) extract 8); if operatør=0 or -,læsbit_ia(operatørmaske,operatør) then tofrom(opkaldsflag,alle_operatører,op_maske_lgd) else sæt_bit_ia(opkaldsflag,operatør,1); ref:= første_frie_opkald; <* forudsættes <> 0 *> første_frie_opkald:=opkaldskø.ref(1) extract 12; <*hægt ud*> forrige:= (if type = 1 then sidste_opkald else sidste_nødopkald); opkaldskø.ref(1):= forrige shift 12; if type = 1 then begin if første_opkald = 0 then første_opkald:= ref; sidste_opkald:= ref; end else begin <*type = 2*> if første_nødopkald = 0 then første_nødopkald:= ref; sidste_nødopkald:= ref; end; if forrige <> 0 then opkaldskø.forrige(1):= opkaldskø.forrige(1) shift (-12) shift 12 +ref; opkaldskø.ref(2):= tilst extract 22 add (if type=2 then 1 shift 23 else 0); opkaldskø.ref(3):= ll; systime(5,0.0,r); ll:= round r//100;<*ttmm*> opkaldskø.ref(4):= ll shift 12 +type shift 8 +operatør extract 8; opkaldskø.ref(5):= sig shift 20 + omr; tofrom(opkaldskø.ref.opkald_meldt,ingen_operatører,op_maske_lgd); res:= 0; if type=2 then nød_opkald_brugt:=nødopkald_brugt + 1; opkaldskø_ledige:= opkaldskø_ledige -1; <*meddel opkald til berørte operatører *> signal_bin(bs_mobil_opkald); tæl_opkald(omr,type+1); end <* resultat = 3 *> else begin \f message procedure indsæt_opkald side 3 - 810601/hko; <* d.vt_op.resultat <> 3 *> res:= d.vt_op.resultat; if res = 10 then fejlreaktion(20<*mobilopkald, bus *>,bus, <:er ikke i bustabel:>,1) else <*+4*> if res <> 14 and res <> 18 then fejlreaktion(19<*radio*>,res,<:busreservationsresultat:>,1); <*-4*> ; end; signalbin(bs_opkaldskø_adgang); signal_ch(cs_vt_adgang,vt_op,gen_optype or vt_optype); end else res:= -2; <*timeout for cs_vt_adgang*> end; indsæt_opkald:= res; end indsæt_opkald; \f message procedure afvent_telegram side 1 - 880901/cl; integer procedure afvent_telegram(tlgr,lgd,ttyp,ptyp,pnum); integer array tlgr; integer lgd,ttyp,ptyp,pnum; begin integer i, pos, tegn, ac, sum, csum; pos:= 1; lgd:= 0; ttyp:= 'Z'; <*V*> ac:= afvent_radioinput(z_fr_in,tlgr,false); if ac >= 0 then begin lgd:= 1; while læstegn(tlgr,lgd,tegn)<>0 do ; lgd:= lgd-2; if lgd >= 3 then begin i:= 1; ttyp:= læstegn(tlgr,i,tegn); ptyp:= læstegn(tlgr,i,tegn) - '@'; pnum:= læstegn(tlgr,i,tegn) - '@'; end else ac:= 6; <* for kort telegram - retransmitter *> end; afvent_telegram:= ac; end; \f message procedure b_answ side 1 - 880901/cl; procedure b_answ(answ,ht,spec,more,ac); value ht, more,ac; integer array answ, spec; boolean more; integer ht, ac; begin integer pos, i, sum, tegn; pos:= 1; skrivtegn(answ,pos,'B'); skrivtegn(answ,pos,if more then 'B' else ' '); skrivtegn(answ,pos,ac+'@'); skrivtegn(answ,pos,spec(1) shift (-18) extract 6+'@'); skrivtegn(answ,pos,spec(1) shift (-12) extract 6+'@'); skrivtegn(answ,pos,'@'); skrivtegn(answ,pos,spec(1) shift (-8) extract 4+'@'); skrivtegn(answ,pos,spec(1) extract 8+'@'); for i:= 1 step 1 until spec(1) extract 8 do if spec(1+i)=0 then skrivtegn(answ,pos,'@') else begin skrivtegn(answ,pos,'D'); anbringtal(answ,pos,spec(1+i),-4); end; for i:= 1 step 1 until 4 do skrivtegn(answ,pos,'@'); skrivtegn(answ,pos,ht+'@'); skrivtegn(answ,pos,'@'); i:= 1; sum:= 0; while i < pos do sum:= (sum + læstegn(answ,i,tegn)) mod 256; skrivtegn(answ,pos,(sum shift (-4)) extract 4 + '@'); skrivtegn(answ,pos,sum extract 4 + '@'); repeat skrivtegn(answ,pos,0) until (pos mod 6)=1; end; \f message procedure ann_opkald side 1 - 881108/cl; integer procedure ann_opkald(vogn,omr); value vogn,omr; integer vogn,omr; begin integer array field vt_op,ref,næste,forrige; integer res, t, i, o; waitch(cs_vt_adgang,vt_op,true,-1); res:= -1; wait(bs_opkaldskø_adgang); ref:= første_nødopkald; if ref <> 0 then t:= 2 else begin ref:= første_opkald; t:= if ref<>0 then 1 else 0; end; if t=0 then res:= 19 <* kø tom *> else begin while ref<>0 and res=(-1) do begin if vogn=opkaldskø.ref(2) extract 14 and omr=opkaldskø.ref(5) extract 8 then res:= 0 else begin ref:= opkaldskø.ref(1) extract 12; if ref=0 and t=2 then begin ref:= første_opkald; t:= if ref=0 then 0 else 1; end; end; end; <*while*> \f message procedure ann_opkald side 2 - 881108/cl; if ref<>0 then begin start_operation(vt_op,401,cs_radio_ind,17); d.vt_op.data(1):= vogn; d.vt_op.data(4):= omr; signalch(cs_vt,vt_op,gen_optype or vt_optype); waitch(cs_radio_ind,vt_op,vt_optype,-1); o:= opkaldskø.ref(4) extract 8; næste:= opkaldskø.ref(1); forrige:= næste shift (-12); næste:= næste extract 12; if forrige<>0 then opkaldskø.forrige(1):= opkaldskø.forrige(1) shift (-12) shift 12 + næste else if t=2 then første_nødopkald:= næste else første_opkald:= næste; if næste<>0 then opkaldskø.næste(1):= opkaldskø.næste(1) extract 12 + forrige shift 12 else if t=2 then sidste_nødopkald:= forrige else sidste_opkald:= forrige; opkaldskø.ref(1):= første_frie_opkald; første_frie_opkald:= ref; opkaldskø_ledige:= opkaldskø_ledige + 1; if t=2 then nødopkald_brugt:= nødopkald_brugt - 1; if -, læsbit_ia(operatør_maske,o) or o=0 then tofrom(opkaldsflag,alle_operatører,op_maske_lgd) else begin sætbit_ia(opkaldsflag,o,1); end; signalbin(bs_mobilopkald); end; end; signalbin(bs_opkaldskø_adgang); signalch(cs_vt_adgang, vt_op, true); ann_opkald:= res; end; \f message procedure frigiv_id side 1 - 881114/cl; integer procedure frigiv_id(id,omr); value id,omr; integer id,omr; begin integer array field vt_op; if id shift (-22) < 3 and omr > 2 then begin waitch(cs_vt_adgang,vt_op,true,-1); start_operation(vt_op,401,cs_radio_ind, if id shift (-22) = 2 then 18 else 17); d.vt_op.data(1):= id; d.vt_op.data(4):= omr; signalch(cs_vt,vt_op,vt_optype or gen_optype); waitch(cs_radio_ind,vt_op,vt_optype,-1); frigiv_id:= d.vt_op.resultat; signalch(cs_vt_adgang,vt_op,true); end; end; \f message procedure radio_ind side 2 - 810524/hko; trap(radio_ind_trap); laf:= 0; stack_claim((if cm_test then 200 else 150) +135+75); <*+2*>if testbit32 and overvåget or testbit28 then skriv_radio_ind(out,0); <*-2*> answ.laf(1):= long<:<'nl'>:>; io_opref:= op; repeat ac:= afvent_telegram(tlgr,lgd,ttyp,ptyp,pnum); pos:= 4; if ac = 0 then begin \f message procedure radio_ind side 3 - 881107/cl; if ttyp = 'A' then begin if ptyp<>4 or pnum<1 or pnum>max_antal_taleveje then ac:= 1 else begin typ(1):= 1 shift 12 + (opkode - 1); <* eq shortint opgave *> val(1):= ttyp; typ(2):= 2 shift 12 + (data + 2); <* eq integer data(1) *> val(2):= pnum; typ(3):= -1; getch(cs_radio_ind,opref,rad_optype,typ,val); if opref>0 then begin if læstegn(tlgr,pos,tegn)<>'@' <*BST*> or læstegn(tlgr,pos,tegn)<>'A' <*PET*> or læstegn(tlgr,pos,tegn)<>d.opref.data(2)+'@' <*CTYP*> or læstegn(tlgr,pos,tegn)<>'@' <*TNO*> then begin ac:= 1; d.opref.resultat:= 31; <* systemfejl *> end else begin ac:= 0; d.opref.resultat:= 0; sætbit_ia(hookoff_maske,pnum,1); end; signalch(d.opref.retur,opref,d.opref.optype); end else ac:= 2; end; pos:= 1; skrivtegn(answ,pos,'A'); skrivtegn(answ,pos,' '); skrivtegn(answ,pos,ac+'@'); for i:= 1 step 1 until 5 do skrivtegn(answ,pos,'@'); skrivtegn(answ,pos,'0'); i:= 1; sum:= 0; while i < pos do sum:= (sum + læstegn(answ,i,tegn)) mod 256; skrivtegn(answ,pos,sum shift (-4) extract 4 + '@'); skrivtegn(answ,pos,sum extract 4 + '@'); repeat afsluttext(answ,pos) until pos mod 6 = 1; write(z_fr_out,"nl",1,answ.laf,"cr",1); <*+2*> if (testbit36 or testbit38) and overvåget then disable begin write(zrl,<<zd dd dd.dd >,now,<:fr-answ: :>,answ.laf); outchar(zrl,'nl'); end; <*-2*> disable setposition(z_fr_out,0,0); ac:= -1; \f message procedure radio_ind side 4 - 881107/cl; end <* ttyp=A *> else if ttyp = 'B' then begin if ptyp<>4 or pnum<1 or pnum>max_antal_taleveje then ac:= 1 else begin typ(1):= 1 shift 12 + (opkode-1); val(1):= 'B'; typ(2):= 2 shift 12 + (data+2); val(2):= pnum; typ(3):= -1; getch(cs_radio_ind,opref,rad_optype,typ,val); if opref > 0 then begin <*+2*> if testbit37 and overvåget then disable begin skriv_radio_ind(out,0); write(out,<:radio-ind B-op udtaget fra cs:>,<<d>,cs_radio_ind); skriv_op(out,opref); end; <*-2*> læstegn(tlgr,pos,bs); if bs = 'V' then begin b_pt:= læstegn(tlgr,pos,tegn) - '@'; b_pn:= læstegn(tlgr,pos,tegn) - '@'; end; if bs<>'Z' and bs<>d.opref.data(2) or bs='V' and (b_pt<>d.opref.data(10) shift (-18) extract 6 or b_pn<>d.opref.data(10) shift (-12) extract 6) then begin ac:= 1; d.opref.resultat:= 31; <* systemfejl *> signalch(d.opref.retur,opref,d.opref.optype); end else if bs='V' then begin ac:= 0; d.opref.resultat:= 1; d.opref.data(4):= 0; d.opref.data(7):= 1 shift (if b_pt=2 then pabx_id(b_pn) else radio_id(b_pn)); systime(1,0.0,d.opref.tid); signalch(cs_radio_ind,opref,d.opref.optype); spec:= data+18; b_answ(answ,0,d.opref.spec,false,ac); <*+2*> if (testbit36 or testbit38) and overvåget then disable begin write(zrl,<<zd dd dd.dd >,now,<:fr-answ: :>,answ.laf); outchar(zrl,'nl'); end; <*-2*> write(z_fr_out,"nl",1,answ.laf,"cr",1); disable setposition(z_fr_out,0,0); ac:= -1; \f message procedure radio_ind side 5 - 881107/cl; end else begin integer sig_type; ac:= 0; antal_spec:= d.opref.data(4); filref:= d.opref.data(5); spec:= d.opref.data(6); if antal_spec>0 then begin antal_spec:= antal_spec-1; if filref<>0 then begin læsfil(filref,1,zno); b_pt:= fil(zno).spec(1) shift (-12); sig_type:= fil(zno).spec(1) shift (-8) extract 4; b_answ(answ,d.opref.data(3),fil(zno).spec, antal_spec>0,ac); spec:= spec + (fil(zno).spec(1) extract 8 + 1)*2; end else begin b_pt:= d.opref.spec(1) shift (-12); sig_type:= d.opref.spec(1) shift (-8) extract 4; b_answ(answ,d.opref.data(3),d.opref.spec, antal_spec>0,ac); spec:= spec + d.opref.spec(1) extract 8*2 + 2; end; <* send answer *> <*+2*> if (testbit36 or testbit38) and overvåget then disable begin write(zrl,<<zd dd dd.dd >,now,<:fr-answ: :>,answ.laf); outchar(zrl,'nl'); end; <*-2*> write(z_fr_out,"nl",1,answ.laf,"cr",1); disable setposition(z_fr_out,0,0); if ac<>0 then begin antal_spec:= 0; ac:= -1; end else begin for i:= 1 step 1 until max_antal_områder do if område_id(i,2)=b_pt then begin j:= (if b_pt=3 and sig_type=2 then 0 else i); if sætbiti(d.opref.data(7),j,1)=0 then d.opref.resultat:= d.opref.resultat + 1; end; end; end; \f message procedure radio_ind side 6 - 881107/cl; <* afvent nyt telegram *> d.opref.data(4):= antal_spec; d.opref.data(6):= spec; ac:= -1; systime(1,0.0,d.opref.tid); <*+2*> if testbit37 and overvåget then disable begin skriv_radio_ind(out,0); write(out,<:radio-ind B-op retur på cs:>,<<d>,cs_radio_ind); skriv_op(out,opref); ud; end; <*-2*> signalch(cs_radio_ind,opref,d.opref.optype); end; end else ac:= 2; end; if ac > 0 then begin for i:= 1 step 1 until 6 do val(i):= 0; b_answ(answ,0,val,false,ac); <*+2*> if (testbit36 or testbit38) and overvåget then disable begin write(zrl,<<zd dd dd.dd >,now,<:fr-answ: :>,answ.laf); outchar(zrl,'nl'); end; <*-2*> write(z_fr_out,"nl",1,answ.laf,"cr",1); disable setposition(z_fr_out,0,0); ac:= -1; end; \f message procedure radio_ind side 7 - 881107/cl; end <* ttyp = 'B' *> else if ttyp='C' or ttyp='J' then begin if ptyp<>4 or pnum<1 or pnum>max_antal_taleveje then ac:= 1 else begin typ(1):= 1 shift 12 + (opkode - 1); val(1):= 'B'; typ(2):= 2 shift 12 + (data + 2); val(2):= pnum; typ(3):= -1; getch(cs_radio_ind,opref,rad_optype,typ,val); if opref > 0 then begin d.opref.resultat:= d.opref.resultat - 1; if ttyp = 'C' then begin b_pt:= læstegn(tlgr,4,tegn)-'@'; <* ????? *> b_pn:= læstegn(tlgr,5,tegn)-'@'; <* ????? *> j:= 0; for i:= 1 step 1 until max_antal_kanaler do if kanal_id(i)=b_pt shift 5 + b_pn then j:= i; if kanal_til_omr(j)=3 and d.opref.resultat>0 then d.opref.resultat:= d.opref.resultat-1; sætbiti(optaget_flag,j,1); sætbiti(d.opref.data(9),j,1); end else begin <* INGEN FORBINDELSE *> sætbiti(d.opref.data(8),læstegn(tlgr,4,tegn)-'@',1); end; ac:= 0; if d.opref.resultat<>0 or d.opref.data(4)<>0 then begin systime(1,0,d.opref.tid); signal_ch(cs_radio_ind,opref,d.opref.op_type); end else begin d.opref.resultat:= if d.opref.data(9)<>0 then 0 else if læsbiti(d.opref.data(8),9) then 52 else if læsbiti(d.opref.data(8),10) then 20 else if læsbiti(d.opref.data(8),2) then 52 else 59; signalch(d.opref.retur, opref, d.opref.optype); end; end else ac:= 2; end; pos:= 1; skrivtegn(answ,pos,ttyp); skrivtegn(answ,pos,' '); skrivtegn(answ,pos,ac+'@'); i:= 1; sum:= 0; while i < pos do sum:= (sum + læstegn(answ,i,tegn)) mod 256; skrivtegn(answ,pos,sum shift (-4) + '@'); skrivtegn(answ,pos,sum extract 4 + '@'); repeat afsluttext(answ,pos) until pos mod 6 = 1; <*+2*> if (testbit36 or testbit38) and overvåget then disable begin write(zrl,<<zd dd dd.dd >,now,<:fr-answ: :>,answ.laf); outchar(zrl,'nl'); end; <*-2*> write(z_fr_out,"nl",1,answ.laf,"cr",1); disable setposition(z_fr_out,0,0); ac:= -1; \f message procedure radio_ind side 8 - 881107/cl; end <* ttyp = 'C' or 'J' *> else if ttyp = 'D' then begin if ptyp = 4 <* VDU *> then begin if pnum<1 or pnum>max_antal_taleveje then ac:= 1 else begin inspect(bs_talevej_udkoblet(pnum),j); if j>=0 then begin sætbit_ia(samtaleflag,pnum,1); signal_bin(bs_mobil_opkald); end; if læsbit_ia(hookoff_maske,pnum) then signalbin(bs_talevej_udkoblet(pnum)); ac:= 0; end end else if ptyp=3 or ptyp=2 then begin if ptyp=3 and (pnum<1 or max_antal_radiokanaler<pnum) or ptyp=2 and pnum<>2 then ac:= 1 else begin if læstegn(tlgr,5,tegn)='D' then begin <* teknisk nr i telegram *> b_pn:= 0; for i:= 1 step 1 until 4 do b_pn:= b_pn*10 + læstegn(tlgr,5+i,tegn)-'0'; end else b_pn:= 0; b_pt:= port_til_omr(ptyp shift 6 + pnum); i:= 0; for j:= 1 step 1 until max_antal_kanaler do if kanal_id(j) = ptyp shift 5 + pnum then i:= j; if i<>0 then begin ref:= (i-1)*kanalbeskrlængde; inspect(ss_samtale_nedlagt(i),j); if j>=0 then begin sætbit_ia(samtaleflag, tv_operatør(kanal_tab.ref.kanal_tilstand shift (-16)),1); signalbin(bs_mobil_opkald); end; signal(ss_samtale_nedlagt(i)); if b_pn<>0 then frigiv_id(b_pn,b_pt); begin if kanal_tab.ref.kanal_id1<>0 and (kanal_tab.ref.kanal_id1 shift (-22)<>0 or kanal_tab.ref.kanal_id1 extract 14<>b_pn) then frigiv_id(kanal_tab.ref.kanal_id1,b_pt); if kanal_tab.ref.kanal_id2<>0 and (kanal_tab.ref.kanal_id2 shift (-22)<>0 or kanal_tab.ref.kanal_id2 extract 14<>b_pn) then frigiv_id(kanal_tab.ref.kanal_id2,b_pt); end; sætbiti(optaget_flag,i,0); end; ac:= 0; end; end else ac:= 1; if ac>=0 then begin pos:= i:= 1; sum:= 0; skrivtegn(answ,pos,'D'); skrivtegn(answ,pos,' '); skrivtegn(answ,pos,ac+'@'); skrivtegn(answ,pos,'@'); while i<pos do sum:= (sum + læstegn(answ,i,tegn)) mod 256; skrivtegn(answ,pos, sum shift (-4) extract 4 + '@'); skrivtegn(answ,pos, sum extract 4 + '@'); repeat afsluttext(answ,pos) until pos mod 6 = 1; <*+2*> if (testbit36 or testbit38) and overvåget then disable begin write(zrl,<<zd dd dd.dd >,now,<:fr-answ: :>,answ.laf); outchar(zrl,'nl'); end; <*-2*> write(z_fr_out,"nl",1,answ.laf,"cr",1); disable setposition(z_fr_out,0,0); ac:= -1; end; \f message procedure radio_ind side 9 - 881107/cl; end <* ttyp = D *> else if ttyp='H' then begin integer htyp; htyp:= læstegn(tlgr,7+læstegn(tlgr,6,tegn)-'@',tegn); if htyp='A' then begin <*mobilopkald*> if (ptyp=2 and pnum<>2) or (ptyp=3 and (pnum<1 or pnum>max_antal_radiokanaler)) then ac:= 1 else begin b_pt:= læstegn(tlgr,5,tegn)-'@'; if læstegn(tlgr,6,tegn)='D' then begin <*teknisk nr. i telegram*> b_pn:= 0; for i:= 1 step 1 until 4 do b_pn:= b_pn*10 + læstegn(tlgr,6+i,tegn)-'0'; end else b_pn:= 0; bs:= læstegn(tlgr,9+læstegn(tlgr,6,tegn)-'@',tegn)-'@'+1; <* opkaldstype *> j:= (if ptyp=2 then pabx_id(pnum) else radio_id(pnum)); if j>0 then begin if bs=10 then ann_opkald(b_pn,j) else indsæt_opkald(b_pn,bs,j,if b_pt>1 then 1 else 0); ac:= 0; end else ac:= 1; end; \f message procedure radio_ind side 10 - 881107/cl; end else if htyp='E' then begin <* radiokanal status *> long onavn; ac:= 0; j:= 0; for i:= 1 step 1 until max_antal_kanaler do if kanal_id(i) = ptyp shift 5 + pnum then j:= i; <* Alarmer for K12 = GLX ignoreres *> <* 94.06.14/CL *> <* Alarmer for K15 = HG ignoreres *> <* 95.07.31/CL *> <* Alarmer for K10 = FS ignoreres *> <* 96.05.27/CL *> if j>0 then begin onavn:= områdenavn(port_til_omr(ptyp shift 6 + pnum)); j:= (if (onavn = long<:GLX:>) or (onavn = long<:HG:>) or (onavn = long<:FS:>) then 0 else j); end; læstegn(tlgr,9,tegn); if j<>0 and (tegn='A' or tegn='E') then begin ref:= (j-1)*kanalbeskrlængde; bs:= if tegn='E' then 0 else 15; if bs<>sæt_hex_ciffer(kanal_tab.ref,3,bs) then begin tofrom(kanalflag,alle_operatører,op_maske_lgd); signalbin(bs_mobil_opkald); end; end; if tegn<>'A' and tegn<>'E' and j<>0 then begin waitch(cs_radio_pulje,opref,true,-1); startoperation(opref,401,cs_radio_pulje,23); i:= 1; hægtstring(d.opref.data,i,<:radiofejl :>); if læstegn(tlgr,4,k)<>'@' then begin if k-'@' = 17 then hægtstring(d.opref.data,i,<: AMV:>) else if k-'@' = 18 then hægtstring(d.opref.data,i,<: BHV:>) else begin hægtstring(d.opref.data,i,<: BST:>); anbringtal(d.opref.data,i,k-'@',1); end; end; skrivtegn(d.opref.data,i,' '); hægtstring(d.opref.data,i,string kanal_navn(j)); skrivtegn(d.opref.data,i,' '); hægtstring(d.opref.data,i, string område_navn(kanal_til_omr(j))); if '@'<=tegn and tegn<='F' then hægtstring(d.opref.data,i,case (tegn-'@'+1) of ( <*@*> <:: ukendt fejl:>, <*A*> <:: compad-fejl:>, <*B*> <:: ladefejl:>, <*C*> <:: dør åben:>, <*D*> <:: senderfejl:>, <*E*> <:: compad ok:>, <*F*> <:: liniefejl:>, <::>)) else begin hægtstring(d.opref.data,i,<:: fejlkode :>); skrivtegn(d.opref.data,i,tegn); end; repeat afsluttext(d.opref.data,i) until i mod 6 = 1; signalch(cs_io,opref,gen_optype or rad_optype); ref:= (j-1)*kanalbeskrlængde; tofrom(kanal_tab.ref.kanal_alarm,alle_operatører,op_maske_lgd); tofrom(kanalflag,alle_operatører,op_maske_lgd); signalbin(bs_mobilopkald); end; \f message procedure radio_ind side 11 - 881107/cl; end else if htyp='G' then begin <* fjerninkludering/-ekskludering af område *> bs:= læstegn(tlgr,9,tegn)-'@'; j:= 0; for i:= 1 step 1 until max_antal_kanaler do if kanal_id(i) = ptyp shift 5 + pnum then j:= i; if j<>0 then begin ref:= (j-1)*kanalbeskrlængde; sætbiti(kanal_tab.ref.kanal_tilstand,11,bs extract 1); end; tofrom(kanalflag,alle_operatører,op_maske_lgd); signalbin(bs_mobilopkald); ac:= 0; end else if htyp='L' then begin <* vogntabelændringer *> long field ll; ll:= 10; ac:= 0; zno:= port_til_omr(ptyp shift 6 + pnum); læstegn(tlgr,9,tegn); if (tegn='N') or (tegn='O') then begin typ(1):= 1 shift 12 + (opkode-1); val(1):= 'H'; typ(2):= -1; getch(cs_radio_ind,opref,rad_optype,typ,val); if opref>0 then begin d.opref.resultat:= if tegn='N' then 3 else 60; signalch(d.opref.retur,opref,d.opref.optype); end; ac:= -1; end else if (tegn='G') and (tlgr.ll=(long<:FFFFF:> add 'F')) then ac:= -1 else if tegn='G' then <*indkodning*> begin pos:= 10; i:= 0; while læstegn(tlgr,pos,tegn)>='0' and tegn<='9' and pos<=14 do i:= i*10 + (tegn-'0'); i:= i mod 1000; b_pn:= (1 shift 22) + (i shift 12); if pos=14 and 'A'<=tegn and tegn<='Å' then b_pn:= b_pn + ((tegn-'@') shift 7); pos:= 14; i:= 0; while læstegn(tlgr,pos,tegn)>='0' and tegn<='9' and pos<=16 do i:= i*10 + (tegn-'0'); b_pn:= b_pn + i; pos:= 16; i:= 0; while læstegn(tlgr,pos,tegn)>='0' and tegn<='9' and pos<=20 do i:= i*10 + (tegn-'0'); b_pt:= i; bs:= 11; \f message procedure radio_ind side 12 - 881107/cl; end else if tegn='H' then <*udkodning*> begin pos:= 10; i:= 0; while læstegn(tlgr,pos,tegn)>='0' and tegn<='9' and pos<=14 do i:= i*10 + (tegn-'0'); b_pt:= i; b_pn:= 0; bs:= 12; end else if tegn='I' then <*slet tabel*> begin b_pt:= 1; b_pn:= 999; bs:= 19; pos:= 10; i:= 0; i:= hex_to_dec(læstegn(tlgr,pos,tegn))*16 + hex_to_dec(læstegn(tlgr,pos,tegn)); zno:= i; end else ac:= 2; if ac<0 then ac:= 0 else if ac=0 then begin waitch(cs_vt_adgang,opref,true,-1); startoperation(opref,401,cs_vt_adgang,bs); d.opref.data(1):= b_pt; d.opref.data(2):= b_pn; d.opref.data(if bs=19 then 3 else 4):= zno; signalch(cs_vt,opref,gen_optype or vt_optype); end; end else ac:= 2; pos:= 1; skrivtegn(answ,pos,'H'); skrivtegn(answ,pos,' '); skrivtegn(answ,pos,ac+'@'); i:= 1; sum:= 0; while i < pos do sum:= (sum + læstegn(answ,i,tegn)) mod 256; skriv_tegn(answ,pos, sum shift (-4) extract 4 +'@'); skriv_tegn(answ,pos, sum extract 4 +'@'); repeat afsluttext(answ,pos) until pos mod 6 = 1; <*+2*> if (testbit36 or testbit38) and overvåget then disable begin write(zrl,<<zd dd dd.dd >,now,<:fr-answ: :>,answ.laf); outchar(zrl,'nl'); end; <*-2*> write(z_fr_out,"nl",1,answ.laf,"cr",1); disable setposition(z_fr_out,0,0); ac:= -1; \f message procedure radio_ind side 13 - 881107/cl; end else if ttyp = 'I' then begin typ(1):= -1; repeat getch(cs_radio_ind,opref,true,typ,val); if opref<>0 then begin d.opref.resultat:= 31; signalch(d.opref.retur,opref,d.opref.op_type); end; until opref=0; for i:= 1 step 1 until max_antal_taleveje do if læsbit_ia(hookoff_maske,i) then begin signalbin(bs_talevej_udkoblet(i)); sætbit_ia(samtaleflag,tv_operatør(i),1); end; if antal_bits_ia(samtaleflag,1,max_antal_operatører)<>0 then signal_bin(bs_mobil_opkald); for i:= 1 step 1 until max_antal_kanaler do begin ref:= (i-1)*kanalbeskrlængde; if kanal_tab.ref.kanal_tilstand extract 2 <> 0 then begin if kanal_tab.ref.kanal_id2<>0 and kanal_tab.ref.kanal_id2 shift (-22)<>3 then begin signal(ss_samtale_nedlagt(i)); frigiv_id(kanal_tab.ref.kanal_id2,kanal_til_omr(i)); end; if kanal_tab.ref.kanal_id1<>0 then begin signal(ss_samtale_nedlagt(i)); frigiv_id(kanal_tab.ref.kanal_id1,kanal_til_omr(i)); end; end; sæt_hex_ciffer(kanal_tab.ref,3,15); end; <*V*> waitch(cs_radio_pulje,opref,true,-1); startoperation(opref,401,cs_radio_pulje,23); i:= 1; hægtstring(d.opref.data,i,<:radio-info: :>); j:= 4; while j<=lgd and i<(d.opref.opsize - data - 2)//2*3 do begin skrivtegn(d.opref.data,i,læstegn(tlgr,j,tegn)); end; repeat afsluttext(d.opref.data,i) until i mod 6 = 1; signalch(cs_io,opref,gen_optype or rad_optype); optaget_flag:= 0; pos:= i:= 1; sum:= 0; skrivtegn(answ,pos,'I'); skrivtegn(answ,pos,' '); skrivtegn(answ,pos,'@'); while i<pos do sum:= (sum+læstegn(answ,i,tegn)) mod 256; skrivtegn(answ,pos,sum shift (-4) extract 4 + '@'); skrivtegn(answ,pos,sum extract 4 + '@'); repeat afsluttext(answ,pos) until pos mod 6 = 1; <*+2*> if (testbit36 or testbit38) and overvåget then disable begin write(zrl,<<zd dd dd.dd >,now,<:fr-answ: :>,answ.laf); outchar(zrl,'nl'); end; <*-2*> write(z_fr_out,"nl",1,answ.laf,"cr",1); disable setposition(z_fr_out,0,0); ac:= -1; \f message procedure radio_ind side 14 - 881107/cl; end else if ttyp='L' then begin ac:= 0; <****** RADIO-INFO meddelelser til hovedkonsol afhængig af testbi21 ******> if testbit21 then begin waitch(cs_radio_pulje,opref,true,-1); startoperation(opref,401,cs_radio_pulje,23); i:= 1; hægtstring(d.opref.data,i,<:radio-info: :>); j:= 4; while j<=lgd and i<(d.opref.opsize-data-2)//2*3 do begin skrivtegn(d.opref.data,i,læstegn(tlgr,j,tegn)); end; repeat afsluttext(d.opref.data,i) until i mod 6 = 1; signalch(cs_io,opref,gen_optype or rad_optype); end; <*testbit21*> end else if ttyp='Z' then begin <*+2*> if (testbit36 or testbit38) and overvåget then disable begin write(zrl,<<zd dd dd.dd >,now,<:fr-answ: :>,answ.laf); outchar(zrl,'nl'); end; <*-2*> write(z_fr_out,"nl",1,answ.laf,"cr",1); disable setposition(z_fr_out,0,0); ac:= -1; end else ac:= 1; end; <* telegram modtaget ok *> \f message procedure radio_ind side 15 - 881107/cl; if ac>=0 then begin pos:= i:= 1; sum:= 0; skrivtegn(answ,pos,ttyp); skrivtegn(answ,pos,' '); skrivtegn(answ,pos,ac+'@'); while i<pos do sum:= (sum+læstegn(answ,i,tegn)) mod 256; skrivtegn(answ,pos, sum shift (-4) extract 4 + '@'); skrivtegn(answ,pos, sum extract 4 + '@'); repeat afsluttext(answ,pos) until pos mod 6 = 1; <*+2*> if (testbit36 or testbit38) and overvåget then disable begin write(zrl,<<zd dd dd.dd >,now,<:fr-answ: :>,answ.laf); outchar(zrl,'nl'); end; <*-2*> write(z_fr_out,"nl",1,answ.laf,"cr",1); disable setposition(z_fr_out,0,0); ac:= -1; end; typ(1):= 0; typ(2):= 1 shift 18 + 4 shift 12 + tid; <* lt real tid *> rf:= 4; systime(1,0.0,val.rf); val.rf:= val.rf - 30.0; typ(3):= -1; repeat getch(cs_radio_ind,opref,true,typ,val); if opref>0 then begin d.opref.resultat:= 53; <*annuleret*> signalch(d.opref.retur,opref,d.opref.optype); end; until opref=0; until false; radio_ind_trap: disable skriv_radio_ind(zbillede,1); end radio_ind; \f message procedure radio_ud side 1 - 820301/hko; procedure radio_ud(op); value op; integer op; begin integer array field opref,io_opref; integer opgave, kode, pos, tegn, i, sum, rc, svar_status; integer array answ, tlgr(1:32); long array field laf; procedure skriv_radio_ud(z,omfang); value omfang; zone z; integer omfang; begin integer i1; disable i1:= write(z,"nl",1,<:+++ radio-ud ::>); if omfang > 0 then disable begin real x; long array field tx; tx:= 0; trap(slut); write(z,"nl",1, <: opref: :>,opref,"nl",1, <: io-opref: :>,io_opref,"nl",1, <: opgave: :>,opgave,"nl",1, <: kode: :>,kode,"nl",1, <: pos: :>,pos,"nl",1, <: tegn: :>,tegn,"nl",1, <: i: :>,i,"nl",1, <: sum: :>,sum,"nl",1, <: rc: :>,rc,"nl",1, <: svar-status: :>,svar_status,"nl",1, <: tlgr: ":>,tlgr.tx,<:":>,"nl",1, <: answ: ":>,answ.tx,<:":>,"nl",1, <::>); skriv_coru(z,coru_no(402)); slut: end; <*disable*> end skriv_radio_ud; trap(radio_ud_trap); laf:= 0; stack_claim((if cm_test then 200 else 150) +35+100); <*+2*>if testbit32 and overvåget or testbit28 then skriv_radio_ud(out,0); <*-2*> io_opref:= op; \f message procedure radio_ud side 2 - 810529/hko; repeat <*V*> wait_ch(cs_radio_ud,op_ref,gen_optype or rad_optype,-1); kode:= d.op_ref.opkode; opgave:= kode shift(-12); kode:= kode extract 12; if opgave < 'A' or opgave > 'I' then begin d.opref.resultat:= 31; end else begin pos:= 1; if opgave='A' or opgave='B' or opgave='D' or opgave='H' then begin skrivtegn(tlgr,pos,opgave); if d.opref.data(1) = 0 then begin skrivtegn(tlgr,pos,'G'); skrivtegn(tlgr,pos,'A'); end else begin skrivtegn(tlgr,pos,'D'); skrivtegn(tlgr,pos,d.opref.data(1)+'@'); <*talevejsnr*> end; if opgave='A' then begin skrivtegn(tlgr,pos,d.opref.data(2)+'@'); <*calltype*> end else if opgave='B' then begin skrivtegn(tlgr,pos,d.opref.data(2)); if d.opref.data(2)='V' then begin skrivtegn(tlgr,pos, d.opref.data(10) shift (-18) extract 6+'@'); <*trunktype*> skrivtegn(tlgr,pos, d.opref.data(10) shift (-12) extract 6+'@'); <*trunknum.*> end; d.opref.data(7):= d.opref.data(8):= d.opref.data(9):= 0; d.opref.data(6):= if d.opref.data(5)<>0 then 2 else data+18; end else if opgave='H' then begin skrivtegn(tlgr,pos,d.opref.data(3)+'@'); <*trunktype*> skrivtegn(tlgr,pos,d.opref.data(4)+'@'); <*trunknum.*> hægtstring(tlgr,pos,<:@@@:>); skrivtegn(tlgr,pos,d.opref.data(2)); <*H_tlgr_type*> skrivtegn(tlgr,pos,'A'); skrivtegn(tlgr,pos,(if d.opref.data(2)='L' and d.opref.data(5)=8 then 7 else d.opref.data(5))+'@'); if d.opref.data(2)='L' then begin if d.opref.data(5)=7 then begin anbringtal(tlgr,pos, d.opref.data(8) shift (-12) extract 10,-4); anbringtal(tlgr,pos, d.opref.data(8) extract 7,-2); end else if d.opref.data(5)=8 then begin hægtstring(tlgr,pos,<:FFFFFF:>); end; if d.opref.data(5)<>9 then anbringtal(tlgr,pos,d.opref.data(7),-4); skrivtegn(tlgr,pos, dec_to_hex(d.opref.data(6) shift (-4) extract 4)); skrivtegn(tlgr,pos, dec_to_hex(d.opref.data(6) extract 4)); skrivtegn(tlgr,10,pos-11+'@'); end; end; end else if opgave='I' then begin hægtstring(tlgr,pos,<:IGA:>); end else d.opref.resultat:= 31; <*systemfejl*> end; \f message procedure radio_ud side 3 - 881107/cl; if d.opref.resultat=0 then begin if (opgave <= 'B') <* or (opgave='H' and d.opref.data(2)='L') *> then begin systime(1,0,d.opref.tid); signalch(cs_radio_ind,opref,d.opref.optype); opref:= 0; end; <* beregn checksum og send *> i:= 1; sum:= 0; while i < pos do sum:= (sum + læstegn(tlgr,i,tegn)) mod 256; skrivtegn(tlgr,pos,sum shift (-4) + '@'); skrivtegn(tlgr,pos,sum extract 4 + '@'); repeat skrivtegn(tlgr,pos,0) until pos mod 6 = 1; <**********************************************> <* specialaktion p.g.a. modtagebesvær i COMET *> if opgave='B' then delay(1); <* 94.04.19/cl *> <**********************************************> <*+2*> if (testbit36 or testbit39) and overvåget then disable begin write(zrl,<<zd dd dd.dd >,now,<:rf-tlgr: :>,tlgr.laf); outchar(zrl,'nl'); end; <*-2*> setposition(z_rf_in,0,0); write(z_rf_out,"nl",1,tlgr.laf,"cr",1); disable setposition(z_rf_out,0,0); rc:= 0; <* afvent svar*> repeat <*V*> svar_status:= afvent_radioinput(z_rf_in,answ,true); if svar_status=6 then begin svar_status:= -3; goto radio_ud_check; end; pos:= 1; while læstegn(answ,pos,i)<>0 do ; pos:= pos-2; if pos > 0 then begin if pos<3 then svar_status:= -2 <*format error*> else begin if læstegn(answ,3,tegn)<>'@' then svar_status:= tegn - '@' else begin pos:= 1; læstegn(answ,pos,tegn); if tegn<>opgave then svar_status:= -4 <*gal type*> else if læstegn(answ,pos,tegn)<>' ' then svar_status:= -tegn <*fejl*> else svar_status:= læstegn(answ,pos,tegn)-'@'; end; end; end else svar_status:= -1; \f message procedure radio_ud side 5 - 881107/cl; radio_ud_check: rc:= rc+1; if -3<=svar_status and svar_status< -1 then disable begin write(z_rf_out,<:<'nl'>Z@@MJ<'cr'>:>); setposition(z_rf_out,0,0); <*+2*> if (testbit36 or testbit39) and overvåget then begin write(zrl,<<zd dd dd.dd >,now,<:rf-tlgr: Z@@MJ:>); outchar(zrl,'nl'); end; <*-2*> end else if svar_status=6 or svar_status=(-4) or svar_status=(-1) then disable begin write(z_rf_out,"nl",1,tlgr.laf,"cr",1); setposition(z_rf_out,0,0); <*+2*> if (testbit36 or testbit39) and overvåget then begin write(zrl,<<zd dd dd.dd >,now,<:rf-tlgr: :>, tlgr.laf,<: (repeat):>); outchar(zrl,'nl'); end; <*-2*> end else if svar_status=0 and opref<>0 then d.opref.resultat:= 0 else if opref<>0 then d.opref.resultat:= 31; until svar_status=0 or rc>3; end; if opref<>0 then begin if svar_status<>0 and rc>3 then d.opref.resultat:= 53; <* annulleret *> signalch(d.opref.retur,opref,d.opref.optype); opref:= 0; end; until false; radio_ud_trap: disable skriv_radio_ud(zbillede,1); end radio_ud; \f message procedure radio_medd_opkald side 1 - 810610/hko; procedure radio_medd_opkald; begin integer array field ref,op_ref; integer i; procedure skriv_radio_medd_opkald(z,omfang); value omfang; zone z; integer omfang; begin integer x; disable x:= write(z,"nl",1,<:+++ radio-medd-opkald:>); write(z,"sp",26-x); if omfang > 0 then disable begin trap(slut); write(z,"nl",1, <: ref: :>,ref,"nl",1, <: opref: :>,op_ref,"nl",1, <: i: :>,i,"nl",1, <::>); skriv_coru(z,abs curr_coruno); slut: end;<*disable*> end skriv_radio_medd_opkald; trap(radio_medd_opkald_trap); stack_claim((if cm_test then 200 else 150) +1); <*+2*>if testbit32 and overvåget or testbit28 then disable skriv_radio_medd_opkald(out,0); <*-2*> \f message procedure radio_medd_opkald side 2 - 820301/hko; repeat <*V*> wait(bs_mobil_opkald); <*V*> wait_ch(cs_radio_medd,op_ref,genoptype or rad_optype,-1); <*V*> wait(bs_opkaldskø_adgang); ref:= første_nød_opkald; while ref <> 0 do <* meld ikke meldt nødopkald til io *> begin i:= opkaldskø.ref(2); if i < 0 then begin <* nødopkald ikke meldt *> start_operation(op_ref,403,cs_radio_medd,45<*nødop.modt.*>); d.op_ref.data(1):= <* vogn_id *> if opkaldskø.ref(3)<>0 then opkaldskø.ref(3) else i extract 22; opkaldskø.ref(2):= i extract 22; d.op_ref.data(2):= opkaldskø.ref(4) shift(-12); <* ttmm *> d.op_ref.data(3):= opkaldskø.ref(5) extract 20; i:= op_ref; <*+2*> if testbit35 and overvåget then disable begin write(out,"nl",1,<:radio nød-medd:>); skriv_op(out,op_ref); ud; end; <*-2*> signal_ch(cs_io,op_ref,gen_optype or rad_optype); <*V*> wait_ch(cs_radio_medd,op_ref,rad_optype,-1); <*+4*> if i <> op_ref then fejlreaktion(11<*fremmed post*>,i,<:radio io/medd:>,0); <*-4*> end;<*nødopkald ikke meldt*> ref:= opkaldskø.ref(1) extract 12; end; <* melding til io *> \f message procedure radio_medd_opkald side 3 - 820304/hko; start_operation(op_ref,403,cs_radio_medd, 40<*opdater opkaldskøbill*>); signal_bin(bs_opkaldskø_adgang); <*+2*> if testbit35 and overvåget then disable begin write(out,"nl",1,<:radio opdater opkaldskø-billede:>); skriv_op(out,op_ref); write(out, <:opkaldsflag: :>,"nl",1); outintbits_ia(out,opkaldsflag,1,op_maske_lgd//2); write(out,"nl",1,<:kanalflag: :>,"nl",1); outintbits_ia(out,kanalflag,1,op_maske_lgd//2); write(out,"nl",1,<:samtaleflag: :>,"nl",1); outintbits_ia(out,samtaleflag,1,op_maske_lgd//2); ud; end; <*-2*> signal_ch(cs_op,op_ref,gen_optype or rad_optype); until false; radio_medd_opkald_trap: disable skriv_radio_medd_opkald(zbillede,1); end radio_medd_opkald; \f message procedure radio_adm side 1 - 820301/hko; procedure radio_adm(op); value op; integer op; begin integer array field opref, rad_op, iaf; integer nr,i,j,k,res,opgave,tilst,operatør; procedure skriv_radio_adm(z,omfang); value omfang; zone z; integer omfang; begin integer i1; disable i1:= write(z,"nl",1,<:+++ radio-adm:>); write(z,"sp",26-i1); if omfang > 0 then disable begin real x; trap(slut); \f message procedure radio_adm side 2- 820301/hko; write(z,"nl",1, <: op_ref: :>,op_ref,"nl",1, <: iaf: :>,iaf,"nl",1, <: rad-op: :>,rad_op,"nl",1, <: nr: :>,nr,"nl",1, <: i: :>,i,"nl",1, <: j: :>,j,"nl",1, <: k: :>,k,"nl",1, <: tilst: :>,tilst,"nl",1, <: res: :>,res,"nl",1, <: opgave: :>,opgave,"nl",1, <: operatør: :>,operatør,"nl",1); skriv_coru(z,coru_no(404)); slut: end;<*disable*> end skriv_radio_adm; \f message procedure radio_adm side 3 - 820304/hko; rad_op:= op; trap(radio_adm_trap); stack_claim((if cm_test then 200 else 150) +50); <*+2*>if testbit32 and overvåget or testbit28 then skriv_radio_adm(out,0); <*-2*> pass; if -,testbit22 then begin startoperation(rad_op,404,cs_radio_adm,'I' shift 12 + 60); signalch(cs_radio_ud,rad_op,rad_optype); waitch(cs_radio_adm,rad_op,rad_optype,-1); end; repeat waitch(cs_radio_adm,opref,true,-1); <*+2*> if testbit33 and overvåget then disable begin skriv_radio_adm(out,0); write(out,<: operation modtaget på cs:>,<<d>,cs_radio_adm); skriv_op(out,opref); end; <*-2*> k:= d.op_ref.opkode extract 12; opgave:= d.opref.opkode shift (-12); nr:=operatør:=d.op_ref.data(1); <*+4*> if (d.op_ref.optype and (gen_optype or io_optype or op_optype or vt_optype)) extract 12 = 0 then fejlreaktion(12<*operationstype*>,op_ref, <:radio_adm:>,0); <*-4*> if k = 74 <* RA,I *> then begin startoperation(rad_op,404,cs_radio_adm,'I' shift 12 + 60); signalch(cs_radio_ud,rad_op,rad_optype); waitch(cs_radio_adm,rad_op,rad_optype,-1); d.opref.resultat:= if d.rad_op.resultat=0 then 3 else d.rad_op.resultat; signalch(d.opref.retur,opref,d.opref.optype); \f message procedure radio_adm side 4 - 820301/hko; end else if k = 1<*IN,O*> or k = 2<*EK,O*> or k = 77<*FO,O*> or k = 5<*FO,L*> or k = 6<*ST *> then begin if k = 5 or k=77 then begin <*V*> wait(bs_opkaldskø_adgang); if k=5 then begin disable for iaf:= 0 step 512 until (max_linienr//768*512) do begin i:= læs_fil(1035,iaf//512+1,nr); if i <> 0 then fejlreaktion(5<*læs_fil*>,i,<:liniefordelingstabel:>,0); tofrom(radio_linietabel.iaf,fil(nr), if (((max_linienr+1 - (iaf//2*3))+2)//3*2) > 512 then 512 else ((max_linienr+1 - (iaf//2*3))+2)//3*2); end; for i:= 1 step 1 until max_antal_mobilopkald do begin iaf:= i*opkaldskø_postlængde; nr:= opkaldskø.iaf(3) shift (-12) extract 10; <*linienr*> if nr>0 then begin læs_tegn(radio_linietabel,nr+1,operatør); if operatør>max_antal_operatører then operatør:= 0; opkaldskø.iaf(4):= opkaldskø.iaf(4) shift(-8) shift 8 + operatør; end; end; end else if k=77 then begin disable i:= læsfil(1034,1,nr); if i<>0 then fejlreaktion(5,i,<:områdefordelingstabel:>,0); tofrom(radio_områdetabel,fil(nr),max_antal_områder*2); for i:= 1 step 1 until max_antal_mobilopkald do begin iaf:= i*opkaldskø_postlængde; nr:= opkaldskø.iaf(5) extract 4; operatør:= radio_områdetabel(nr); if operatør < 0 or max_antal_operatører < operatør then operatør:= 0; if opkaldskø.iaf(4) extract 8=0 and opkaldskø.iaf(3) shift (-12) extract 10 = 0 then opkaldskø.iaf(4):= opkaldskø.iaf(4) shift(-8) shift 8 + operatør; end; end; tofrom(opkaldsflag,alle_operatører,op_maske_lgd); signal_bin(bs_opkaldskø_adgang); signal_bin(bs_mobil_opkald); d.op_ref.resultat:= res:= 3; \f message procedure radio_adm side 5 - 820304/hko; end <*k = 5 / k = 77*> else begin <*k =1,2 eller 6 (IN,O - EK,O eller ST) *> res:= 3; for nr:= 1 step 1 until max_antal_kanaler do begin iaf:= (nr-1)*kanal_beskr_længde; if kanal_tab.iaf.kanal_tilstand shift (-16) = op_talevej(operatør) then begin tilst:= kanal_tab.iaf.kanal_tilstand extract 2; if tilst <> 0 then res:= 16; <*skærm optaget*> end; <* kanal_tab(operatør) = operatør*> end; tofrom(opkaldsflag,alle_operatører,op_maske_lgd); sæt_bit_ia(opkaldsflag,operatør,k extract 1); signal_bin(bs_mobil_opkald); d.op_ref.resultat:= res; end;<*k=1,2 eller 6 *> <*+2*> if testbit35 and overvåget then disable begin skriv_radio_adm(out,0); write(out,<: sender til :>, if k=5 or k=6 or k=77 or res > 3 then d.op_ref.retur else cs_op); skriv_op(out,op_ref); end; <*-2*> if k=5 or k=6 or k=77 or res > 3 then signal_ch(d.op_ref.retur,op_ref,d.op_ref.optype) else begin <*k = (1 eller 2) og res = 3 *> d.op_ref.resultat:=0; signal_ch(cs_op,op_ref,d.op_ref.optype); end; \f message procedure radio_adm side 6 - 816610/hko; end <*k=1,2,5 eller 6*> else if k=3 <*IN,R*> or k=4 <*EK,R*> then begin nr:= d.op_ref.data(1); res:= 3; if nr<=3 then res:= 51 <* afvist *> else begin <* gennemstilling af område *> j:= 1; for i:= 1 step 1 until max_antal_kanaler do begin if kanal_id(i) shift (-5) extract 3 = 3 and radio_id(kanal_id(i) extract 5) = nr then j:= i; end; nr:= j; iaf:= (nr-1)*kanalbeskrlængde; if læsbiti(kanal_tab.iaf.kanal_tilstand,11) == (k=4) then begin startoperation(radop,404,cs_radio_adm,'H' shift 12 + 60); d.rad_op.data(1):= 0; d.rad_op.data(2):= 'G'; <* gennemstil område *> d.rad_op.data(3):= kanal_id(nr) shift (-5) extract 3; d.rad_op.data(4):= kanal_id(nr) extract 5; d.rad_op.data(5):= k extract 1; <* set/slet gennemstilling *> signalch(cs_radio_ud,rad_op,rad_optype); waitch(cs_radio_adm,rad_op,rad_optype,-1); res:= d.rad_op.resultat; if res=0 then res:= 3; sætbiti(kanal_tab.iaf.kanal_tilstand,11,k extract 1); sætbiti(kanal_tab.iaf.kanal_tilstand,10,k extract 1); end; end; d.op_ref.resultat:=res; signal_ch(d.op_ref.retur,op_ref,d.op_ref.optype); tofrom(kanalflag,alle_operatører,op_maske_lgd); signal_bin(bs_mobil_opkald); \f message procedure radio_adm side 7 - 880930/cl; end <* k=3 eller 4 *> else if k=72<*EK,K*> or k=73<*IN,K*> then begin nr:= d.opref.data(1) extract 22; res:= 3; iaf:= (nr-1)*kanalbeskrlængde; start_operation(radop,404,cs_radio_adm,'H' shift 12 + 60); d.rad_op.data(1):= 0; d.rad_op.data(2):= 'C'; <* kanal inkluder/ekskluder *> d.rad_op.data(3):= kanalid(nr) shift (-5) extract 3; d.rad_op.data(4):= kanalid(nr) extract 5; d.rad_op.data(5):= k extract 1; signalch(cs_radio_ud,radop,rad_optype); waitch(cs_radio_adm,radop,rad_optype,-1); res:= d.radop.resultat; if res=0 then res:= 3; j:= if k=72 then 15 else 0; if res=3 and j<>sæt_hex_ciffer(kanal_tab.iaf,3,j) then begin tofrom(kanalflag,alle_operatører,op_maske_lgd); signalbin(bs_mobilopkald); end; d.opref.resultat:= res; signalch(d.opref.retur,opref,d.opref.optype); end else if k=11 or k=12 or k=19 then <*vt_opd*> begin nr:= d.opref.data(1) extract 8; opgave:= if k=19 then 9 else (k-4); if nr<=3 then res:= 51 <*afvist*> else begin startoperation(radop,404,cs_radio_adm,'H' shift 12 + 60); d.radop.data(1):= 0; d.radop.data(2):= 'L'; d.radop.data(3):= omr_til_trunk(nr) shift (-6); d.radop.data(4):= omr_til_trunk(nr) extract 6; d.radop.data(5):= opgave; d.radop.data(6):= d.opref.data(1) shift (-8) extract 8; d.radop.data(7):= d.opref.data(2); d.radop.data(8):= d.opref.data(3); signalch(cs_radio_ud,radop,rad_optype); <*V*> waitch(cs_radio_adm,radop,rad_optype,-1); res:= d.radop.resultat; if res=0 then res:= 3; end; d.opref.resultat:= res; signalch(d.opref.retur,opref,d.opref.optype); end else begin d.op_ref.resultat:= 45; <* ikke implementeret *> signal_ch(d.op_ref.retur,op_ref,d.op_ref.optype); end; until false; radio_adm_trap: disable skriv_radio_adm(zbillede,1); end radio_adm; :5: radio: initialisering \f message radio_initialisering side 1 - 820301/hko; cs_rad:= next_semch; <*+3*>skriv_new_sem(out,3,cs_rad,<:cs_rad(h_mod):>); <*-3*> i:= next_coru(400,<*ident*> 10,<*prioritet*> true<*test_maske*>); j:= new_activity( i, 0, h_radio); <*+3*>skriv_newactivity(out,i,j); <*-3*> opkalds_kø_ledige:= max_antal_mobilopkald; nødopkald_brugt:= 0; læsfil(1034,1,i); tofrom(radio_områdetabel,fil(i),max_antal_områder*2); opkald_meldt:= opkaldskø_postlængde - op_maske_lgd; for i:= system(3,j,opkaldskø) step 1 until j do opkaldskø(i):= 0; første_frie_opkald:=opkaldskø_postlængde; første_opkald:=sidste_opkald:= første_nødopkald:=sidste_nødopkald:=j:=0; for i:=1 step 1 until max_antal_mobil_opkald -1 do begin ref:=i*opkaldskø_postlængde; opkaldskø.ref(1):=j:=j shift 12 +ref +opkaldskø_postlængde; end; ref:=ref+opkaldskø_postlængde; opkaldskø.ref(1):=j shift 12; for ref:= 0 step 512 until (max_linienr//768*512) do begin i:= læs_fil(1035,ref//512+1,j); if i <> 0 then fejlreaktion(5<*læs_fil*>,i,<:liniefordelingstabel:>,0); tofrom(radio_linietabel.ref,fil(j), if (((max_linienr+1 - (ref//2*3))+2)//3*2) > 512 then 512 else ((max_linienr+1 - (ref//2*3))+2)//3*2); end; for i:= system(3,j,kanal_tab) step 1 until j do kanal_tab(i):= 0; kanal_tilstand:= 2; kanal_id1:= 4; kanal_id2:= 6; kanal_spec:= 8; kanal_alt_id1:= 10; kanal_alt_id2:= 12; kanal_mon_maske:= 12; kanal_alarm:= kanal_mon_maske+tv_maske_lgd; for i:= 1 step 1 until max_antal_kanaler do begin ref:= (i-1)*kanalbeskrlængde; sæthexciffer(kanal_tab.ref,3,15); if kanal_id(i) shift (-5) extract 3 = 2 or kanal_id(i) shift (-5) extract 3 = 3 and radio_id(kanal_id(i) extract 5)<=3 then begin sætbiti(kanal_tab.ref.kanal_tilstand,11,1); sætbiti(kanal_tab.ref.kanal_tilstand,10,1); end; end; tofrom(opkaldsflag,alle_operatører,op_maske_lgd); tofrom(samtaleflag,ingen_operatører,op_maske_lgd); tofrom(hookoff_maske,ingen_taleveje,tv_maske_lgd); optaget_flag:= 0; \f message radio_initialisering side 2 - 810524/hko; bs_mobil_opkald:= next_sem; <*+3*>skriv_new_sem(out,1,bs_mobil_opkald,<:bs_mobil_opkald:>); <*-3*> bs_opkaldskø_adgang:= next_sem; signal_bin(bs_opkaldskø_adgang); <*+3*>skriv_new_sem(out,1,bs_opkaldskø_adgang,<:bs_opk.kø_adgang:>); <*-3*> cs_radio_medd:=next_semch; signal_ch(cs_radio_medd,nextop(data+6),gen_optype or rad_optype); <*+3*>skriv_new_sem(out,3,cs_radio_medd,<:cs_radio_medd:>); <*-3*> i:= next_coru(403, 5,<*prioritet*> true<*testmaske*>); j:= new_activity( i, 0, radio_medd_opkald); <*+3*>skriv_newactivity(out,i,j); <*-3*> cs_radio_adm:= nextsemch; <*+3*>skriv_new_sem(out,3,cs_radio_adm,<:cs_radio_adm:>); <*-3*> i:= next_coru(404, 10, true); j:= new_activity(i, 0, radio_adm,next_op(data+radio_op_længde)); <*+3*>skriv_new_activity(out,i,j); <*-3*> \f message radio_initialisering side 3 - 810526/hko; for k:= 1 step 1 until max_antal_taleveje do begin cs_radio(k):=next_semch; <*+3*>skriv_new_sem(out,3,cs_radio(k),<:cs_radio( ):>); <*-3*> bs_talevej_udkoblet(k):= nextsem; <*+3*>skriv_new_sem(out,1,bs_talevej_udkoblet(k),<:bs_talevej_udkoblet( ):>); <*-3*> i:=next_coru(410+k, 10, true); j:=new_activity( i, 0, radio,k,next_op(data + radio_op_længde)); <*+3*>skriv_newactivity(out,i,j); <*-3*> end; cs_radio_pulje:=next_semch; <*+3*>skriv_new_sem(out,3,cs_radio_pulje,<:cs-radio-pulje:>); <*-3*> for i:= 1 step 1 until radiopulje_størrelse do signal_ch(cs_radio_pulje, next_op(60), gen_optype or rad_optype); cs_radio_kø:= next_semch; <*+3*>skriv_new_sem(out,3,cs_radio_kø,<:cs_radio_kø:>); <*-3*> mobil_opkald_aktiveret:= true; \f message radio_initialisering side 4 - 810522/hko; laf:=raf:=0; open(z_fr_in,8,radio_fr_navn,radio_giveup); i:= monitor(8)reserve process:(z_fr_in,0,ia); j:=1; if i <> 0 then fejlreaktion(4<*monitor resultat*>,i, string radio_fr_navn.raf(increase(j)),1); open(z_fr_out,4 shift 12 + 8,radio_fr_navn,radio_giveup); i:= monitor(8)reserve process:(z_fr_out,0,ia); j:=1; if i <> 0 then fejlreaktion(4,i,string radio_fr_navn.raf(increase(j)),1); ia(1):= 3 <*canonical*>; ia(2):= 0 <*no echo*>; ia(3):= 0 <*prompt*>; ia(4):= 5 <*timeout*>; setcspterm(radio_fr_navn.laf,ia); open(z_rf_in,8,radio_rf_navn,radio_giveup); i:= monitor(8)reserve process:(z_rf_in,0,ia); j:= 1; if i <> 0 then fejlreaktion(4<*monitor resultat*>,i, string radio_rf_navn.raf(increase(j)),1); open(z_rf_out,4 shift 12 + 8,radio_rf_navn,radio_giveup); i:= monitor(8)reserve process:(z_rf_out,0,ia); j:= 1; if i <> 0 then fejlreaktion(4,i,string radio_rf_navn.raf(increase(j)),1); ia(1):= 3 <*canonical*>; ia(2):= 0 <*no echo*>; ia(3):= 0 <*prompt*>; ia(4):= 5 <*timeout*>; setcspterm(radio_rf_navn.laf,ia); \f message radio_initialisering side 5 - 810521/hko; for k:= 1 step 1 until max_antal_kanaler do begin ss_radio_aktiver(k):=next_sem; <*+3*>skriv_new_sem(out,2,ss_radio_aktiver(k),<:ss_rad_aktiver( ):>); <*-3*> ss_samtale_nedlagt(k):=next_sem; <*+3*>skriv_new_sem(out,2,ss_samtale_nedlagt(k),<:ss_samtale_nedlagt( ):>); <*-3*> end; cs_radio_ind:= next_semch; <*+3*>skriv_new_sem(out,3,cs_radio_ind,<:cs_radio_ind:>); <*-3*> i:= next_coru(401,<*ident radio_ind*> 3, <*prioritet*> true <*testmaske*>); j:= new_activity( i, 0, radio_ind,next_op(data + 64)); <*+3*>skriv_newactivity(out,i,j); <*-3*> cs_radio_ud:=next_semch; <*+3*>skriv_new_sem(out,3,cs_radio_ud,<:cs_radio_ud:>); <*-3*> i:= next_coru(402,<*ident radio_out*> 10,<*prioritet*> true <*testmaske*>); j:= new_activity( i, 0, radio_ud,next_op(data + 64)); <*+3*>skriv_newactivity(out,i,j); <*-3*> :6: radio trapaktion1. \f message radio trapaktion side 1 - 820301/hko; write(zbillede,"nl",2,"=",20,<: radiomodul :>,"=",20,"nl",1); skriv_kanal_tab(zbillede); skriv_opkaldskø(zbillede); skriv_radio_linietabel(zbillede); skriv_radio_områdetabel(zbillede); :7: radio trapaktion2. \f message radio_finale side 1 - 810525/hko; write(out,<:lukker radio:>); ud; close(z_fr_in,true); close(z_fr_out,true); close(z_rf_in,true); close(z_rf_out,true); ▶EOF◀