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