|
|
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: 94464 (0x17100)
Types: TextFile
Names: »htvogntabel «
└─⟦cde9d517b⟧ Bits:30007477 RC8000 Backup tape fra HT's bus-radio system
└─⟦6a563b143⟧
└─⟦this⟧ »htvogntabel «
vogntabel.
:1: vogntabel: parametererklæringer
\f
message vogntabel parametererklæringer side 1 - 810309/cl;
integer vt_op_længde;
:2: vogntabel: parameterinitialisering
\f
message vogntabel parameterinitialisering side 1 - 810309/cl;
vt_op_længde:= data + 16; <* halvord *>
:3: vogntabel: claiming
\f
message vogntabel_claiming side 1 - 810413/cl;
maxcoru:= 1 <* coroutine h_vogntabel (hovedmodulcoroutine) *>
+ 1 <* coroutine vt_opdater *>
+ 1 <* coroutine vt_tilstand *>
+ 1 <* coroutine vt_rapport *>
+ 1 <* coroutine vt_gruppe *>
+ 1 <* coroutine vt_spring *>
+ 1 <* coroutine vt_auto *>
+ maxcoru;
maxsemch:= 1 <* cs_vt *>
+ 1 <* cs_vt_adgang *>
+ 1 <* cs_vt_opd *>
+ 1 <* cs_vt_rap *>
+ 1 <* cs_vt_tilst *>
+ 1 <* cs_vtt_auto *>
+ 1 <* cs_vt_grp *>
+ 1 <* cs_vt_spring *>
+ 5 <* cs_vt_filretur(coru) *>
+ maxsemch;
maxop:= 1 <* vt_op *>
+ 6 <* vt_fil_op + radop *>
+ maxop;
maxnettoop:= vt_op_længde
+ 5*fil_op_længde
+ (if fil_op_længde>(data+20) then fil_op_længde else (data+20))
+ maxnettoop;
:4: vogntabel: erklæringer
\f
message vogntabel erklæringer side 1 - 820301/cl;
integer cs_vt, cs_vt_adgang,cs_vt_opd,cs_vt_rap,
cs_vt_tilst,cs_vt_auto,cs_vt_grp,cs_vt_spring,vt_op;
integer sidste_bus,sidste_linie_løb,tf_vogntabel,
max_antal_i_gruppe,tf_gruppedef,tf_gruppeidenter,tf_springdef;
integer array bustabel,bustabel1(0:max_antal_busser),
linie_løb_tabel(0:max_antal_linie_løb),
garageomr(0:max_antal_garager),
springtabel(1:max_antal_spring,1:3),
gruppetabel(1:max_antal_grupper),
gruppeopkald(1:max_antal_gruppeopkald,1:2); <* ident , filref *>
boolean array busindeks(-1:max_antal_linie_løb),
bustilstand(-1:max_antal_busser),
linie_løb_indeks(-1:max_antal_busser);
real array springtid,springstart(1:max_antal_spring);
long array garagenavn(0:max_antal_garager);
integer procedure find_garagenr(navn);
value navn; integer navn;
begin
long n;
integer i,j;
n:= extend navn shift 24;
j:= 0;
for i:= 1 step 1 until max_antal_garager do
if n=garagenavn(i) then j:= i;
find_garagenr:= j;
end;
\f
message vogntabel erklæringer side 2 - 851001/cl;
procedure skriv_vt_variable(zud);
zone zud;
begin integer i;
write(zud,"nl",1,<:+++++ vogntabel variable::>,"nl",1,<<d>,
<:vt-op-længde :>,vt_op_længde,"nl",1,
<:cs-vt :>,cs_vt,"nl",1,
<:cs-vt-adgang :>,cs_vt_adgang,"nl",1,
<:cs-vt-opd :>,cs_vt_opd,"nl",1,
<:cs-vt-rap :>,cs_vt_rap,"nl",1,
<:cs-vt-tilst :>,cs_vt_tilst,"nl",1,
<:cs-vt-auto :>,cs_vt_auto,"nl",1,
<:cs-vt-grp :>,cs_vt_grp,"nl",1,
<:cs-vt-spring :>,cs_vt_spring,"nl",1,
<:vt-op :>,vt_op,"nl",1,
<:sidste-bus :>,sidste_bus,"nl",1,
<:sidste-linie-løb :>,sidste_linie_løb,"nl",1,
<:max-antal-i-gruppe :>,max_antal_i_gruppe,"nl",1,
<:tf-vogntabel :>,tf_vogntabel,"nl",1,
<:tf-gruppedef :>,tf_gruppedef,"nl",1,
<:tf-gruppeidenter :>,tf_gruppeidenter,"nl",1,
<:tf-springdef :>,tf_springdef,"nl",1,
<::>);
write(zud,<:garagenavn:<'nl'>:>);
for i:= 1 step 1 until max_antal_garager do
write(zud,<<dd>,i,<:: :>,string garagenavn(i),"nl",1);
end;
\f
message procedure p_vogntabel side 1 - 820301/cl;
procedure p_vogntabel(z);
zone z;
begin
integer i,b,s,o,t,li,lb,lø,g;
write(z,<:<10>***** udskrift af vogntabel *****<10>:>,
<:<10>max-antal-busser =:>,max_antal_busser,<: sidste-bus =:>,
sidste_bus,<:<10>max-antal-linie-løb =:>,max_antal_linie_løb,
<: sidste-linie-løb =:>,sidste_linie_løb,"nl",1);
for i:= 1 step 1 until sidste_bus do
begin
b:= bustabel(i) extract 14;
g:= bustabel(i) shift (-14);
s:= bustabel1(i) shift (-23);
o:= bustabel1(i) extract 8;
t:= intg(bustilstand(i));
li:= linie_løb_tabel(linie_løb_indeks(i) extract 12);
lø:= li extract 7;
lb:= li shift (-7) extract 5;
lb:= if lb=0 then 32 else lb+64;
li:= li shift (-12) extract 10;
write(z,if i mod 2 = 1 then <:<10>:> else <: :>,
<<zddd>,b,"B",s,"sp",1,if g > 0 then string garagenavn(g) else <: :>,
";",1,string område_navn(o),
<: (:>,<<-dd>,t,<:) :>,li,false add lb,1,<:/:>,<<zd>,lø);
end;
end p_vogntabel;
\f
message procedure p_gruppetabel side 1 - 810531/cl;
procedure p_gruppetabel(z);
zone z;
begin
integer i,nr,bogst;
boolean spc_gr;
write(z,"nl",2,<:***** udskrift af gruppetabel *****:>,"nl",1,
<:max-antal-grupper =:>,max_antal_grupper,
<: max-antal-i-gruppe =:>,max_antal_i_gruppe,
<: max-antal-gruppeopkald =:>,max_antal_gruppeopkald,"nl",2,
<:gruppetabel::>);
for i:= 1 step 1 until max_antal_grupper do
write(z,if i mod 10 = 1 then <:<10>:> else <: :>,<<dd>,i,":",1,
if gruppetabel(i) <> 0 then "G" else " ",1,true,2,<<b>,
gruppetabel(i) extract 7);
write(z,"nl",2,<:gruppeopkald::>);
for i:= 1 step 1 until max_antal_gruppeopkald do
begin
write(z,if i mod 4 = 1 then <:<10>:> else <: :>,<<dd>,i,":",1);
if gruppeopkald(i,1) = 0 then
write(z,"sp",11)
else
begin
spc_gr:= gruppeopkald(i,1) shift (-21) = 5;
if spc_gr then nr:= gruppeopkald(i,1) extract 7
else
begin
nr:= gruppeopkald(i,1) shift (-5) extract 10;
bogst:= gruppeopkald(i,1) extract 5 +'@';
if bogst = '@' then bogst:= 'sp';
end;
if spc_gr then
write(z,<:(G:>,<<d>,true,3,nr)
else
write(z,"(",1,<<ddd>,nr,false add bogst,1);
write(z,",",1,<<dddd>,gruppeopkald(i,2),")",1);
end;
end;
end p_gruppetabel;
\f
message procedure p_springtabel side 1 - 810519/cl;
procedure p_springtabel(z);
zone z;
begin
integer li,bo,max,st,nr;
long indeks;
real t;
write(z,"nl",2,<:***** springtabel *****:>,"nl",1,
<:max-antal-spring =:>,max_antal_spring,"nl",2,
<:nr spring-id max status næste-tid:>,"nl",1);
for nr:= 1 step 1 until max_antal_spring do
begin
write(z,<<dd>,nr);
<* if springtabel(nr,1)<>0 then *>
begin
li:= springtabel(nr,1) shift (-5) extract 10;
bo:= springtabel(nr,1) extract 5;
if bo<>0 then bo:= bo + 'A' - 1;
indeks:= extend springtabel(nr,2) shift 24;
st:= extend springtabel(nr,3) shift (-12) extract 24;
max:= springtabel(nr,3) extract 12;
write(z,"sp",(bo=0) extract 1 + 2,<<ddd>,li,false add bo,1,<:.:>);
write(z,"sp",4-write(z,string indeks),<< dd>,max,<< -dd>,st);
if springtid(nr)<>0.0 then
write(z,<< zddddd.dddd>,systime(4,springtid(nr),t)+t/1000000)
else
write(z,<< d.d >,0.0);
if springstart(nr)<>0.0 then
write(z,<< zddddd.dddd>,systime(4,springstart(nr),t)+t/1000000)
else
write(z,<< d.d >,0.0);
end
<* else
write(z,<: --------:>)*>;
write(z,"nl",1);
end;
end p_springtabel;
\f
message procedure find_busnr side 1 - 820301/cl;
integer procedure findbusnr(ll_id,busnr,garage,tilst);
value ll_id;
integer ll_id, busnr, garage, tilst;
begin
integer i,j;
j:= binærsøg(sidste_linie_løb,
(linie_løb_tabel(i) - ll_id), i);
if j<>0 then <* linie/løb findes ikke *>
begin
find_busnr:= -1;
busnr:= 0;
garage:= 0;
tilst:= 0;
end
else
begin
busnr:= bustabel(busindeks(i) extract 12);
tilst:= intg(bustilstand(intg(busindeks(i))));
garage:= busnr shift (-14);
busnr:= busnr extract 14;
find_busnr:= busindeks(i) extract 12;
end;
end find_busnr;
\f
message procedure søg_omr_bus side 1 - 881027/cl;
integer procedure søg_omr_bus(bus,ll,gar,omr,sig,tilst);
value bus;
integer bus,ll,gar,omr,sig,tilst;
begin
integer i,j,nr,bu,bi,bl;
j:= binærsøg(sidste_bus,((bustabel(bi) extract 14) - (bus extract 14)),bi);
nr:= -1;
if j=0 then
begin
bl:= bu:= bi;
while bl>1 and bustabel(bl-1) extract 14 = bus extract 14 do bl:=bl-1;
while bu<sidste_bus and
bustabel(bu+1) extract 14 = bus extract 14 do bu:= bu+1;
if bl<>bu then
begin
<* flere busser med samme tekniske nr. omr skal passe *>
nr:= -2;
for bi:= bl step 1 until bu do
if bustabel1(bi) extract 8 = omr extract 8 then nr:= bi;
end
else
nr:= bi;
end;
if nr<0 then
begin
<* bus findes ikke *>
ll:= gar:= tilst:= sig:= 0;
end
else
begin
tilst:= intg(bustilstand(nr));
gar:= bustabel(nr) shift (-14);
ll:= linie_løb_tabel( linie_løb_indeks(nr) extract 12 );
if omr=0 then omr:= bustabel1(nr) extract 8;
sig:= bustabel1(nr) shift (-23);
end;
søg_omr_bus:= nr;
end;
\f
message procedure find_linie_løb side 1 - 820301/cl;
integer procedure find_linie_løb(busnr,linie_løb,garage,tilst);
value busnr;
integer busnr, linie_løb, garage, tilst;
begin
integer i,j;
j:= binærsøg(sidste_bus,((bustabel(i) extract 14) - (busnr extract 14)), i);
if j<>0 then <* bus findes ikke *>
begin
find_linie_løb:= -1;
linie_løb:= 0;
garage:= 0;
tilst:= 0;
end
else
begin
tilst:= intg(bustilstand(i));
garage:= bustabel(i) shift (-14);
linie_løb:= linie_løb_tabel(linie_løb_indeks(i) extract 12);
find_linie_løb:= linie_løb_indeks(i) extract 12;
end;
end find_linie_løb;
\f
message procedure h_vogntabel side 1 - 810413/cl;
<* hovedmodulcorutine for vogntabelmodul *>
procedure h_vogntabel;
begin
integer array field op;
integer dest_sem,k;
procedure skriv_h_vogntabel(zud,omfang);
value omfang;
zone zud;
integer omfang;
begin
write(zud,"nl",1,<:+++ hovedmodul vogntabel :>);
if omfang<>0 then
disable
begin
skriv_coru(zud,abs curr_coruno);
write(zud,"nl",1,<<d>,
<:cs-vt :>,cs_vt,"nl",1,
<:op :>,op,"nl",1,
<:dest-sem :>,dest_sem,"nl",1,
<:k :>,k,"nl",1,
<::>);
end;
end;
\f
message procedure h_vogntabel side 2 - 820301/cl;
stackclaim(if cm_test then 198 else 146);
trap(h_vt_trap);
<*+2*>
<**> disable if testbit47 and overvåget or testbit28 then
<**> skriv_h_vogntabel(out,0);
<*-2*>
repeat
waitch(cs_vt,op,true,-1);
<*+4*>
if (d.op.optype and gen_optype) extract 12 = 0 and
(d.op.optype and vt_optype) extract 12 = 0 then
fejlreaktion(12,op,<:vogntabel:>,0);
<*-4*>
disable
begin
k:= d.op.opkode extract 12;
dest_sem:=
if k = 9 then cs_vt_rap else
if k = 10 then cs_vt_rap else
if k = 11 then cs_vt_opd else
if k = 12 then cs_vt_opd else
if k = 13 then cs_vt_opd else
if k = 14 then cs_vt_tilst else
if k = 15 then cs_vt_tilst else
if k = 16 then cs_vt_tilst else
if k = 17 then cs_vt_tilst else
if k = 18 then cs_vt_tilst else
if k = 19 then cs_vt_opd else
if k = 20 then cs_vt_opd else
if k = 21 then cs_vt_auto else
if k = 24 then cs_vt_opd else
if k = 25 then cs_vt_grp else
if k = 26 then cs_vt_grp else
if k = 27 then cs_vt_grp else
if k = 28 then cs_vt_grp else
if k = 30 then cs_vt_spring else
if k = 31 then cs_vt_spring else
if k = 32 then cs_vt_spring else
if k = 33 then cs_vt_spring else
if k = 34 then cs_vt_spring else
if k = 35 then cs_vt_spring else
-1;
\f
message procedure h_vogntabel side 3 - 810422/cl;
<*+2*>
<**> if testbit41 and overvåget then
<**> begin
<**> skriv_h_vogntabel(out,0); write(out,<: modtaget operation:>);
<**> skriv_op(out,op);
<**> end;
<*-2*>
end;
if dest_sem = -1 then
fejlreaktion(2,k,<:vogntabel:>,0);
disable signalch(dest_sem,op,d.op.optype);
until false;
h_vt_trap:
disable skriv_h_vogntabel(zbillede,1);
end h_vogntabel;
\f
message procedure vt_opdater side 1 - 810317/cl;
procedure vt_opdater(op1);
value op1;
integer op1;
begin
integer array field op,radop;
integer funk,res,busnr,ll_id,ll1,omr,gar,sig,tilst,bi,li,s,zi,
format,ll_id1,ll_id2,inf1,inf2,i,bi1,bi2,li1,li2,pm1,
flin,slin,finx,sinx;
integer field bn,ll;
procedure skriv_vt_opd(zud,omfang);
value omfang; integer omfang;
zone zud;
begin
write(zud,"nl",1,<:+++ vt_opdater :>);
if omfang <> 0 then
disable
begin
skriv_coru(zud,abs curr_coruno);
write(zud,"nl",1,
<: op: :>,op,"nl",1,
<: radop::>,radop,"nl",1,
<: funk: :>,funk,"nl",1,
<: res: :>,res,"nl",1,
<::>);
end;
end skriv_vt_opd;
integer procedure opd_omr(fnk,omr,bus,ll);
value fnk,omr,bus,ll;
integer fnk,omr,bus,ll;
begin
if omr extract 8 > 3 then
begin
startoperation(radop,501,cs_vt_opd,fnk);
d.radop.data(1):= omr;
d.radop.data(2):= bus;
d.radop.data(3):= ll;
signalch(cs_rad,radop,vt_optype);
<*V*> waitch(cs_vt_opd,radop,vt_optype,-1);
opd_omr:= d.radop.resultat;
end
else
opd_omr:= 0;
end;
stackclaim((if cm_test then 198 else 146)+75);
bn:= 4; ll:= 2;
radop:= op1;
trap(vt_opd_trap);
<*+2*>
<**> disable if testbit47 and overvåget or testbit28 then
<**> skriv_vt_opd(out,0);
<*-2*>
\f
message procedure vt_opdater side 2 - 851001/cl;
vent_op:
waitch(cs_vt_opd,op,gen_optype or vt_optype,-1);
<*+2*>
<**> disable
<**> if testbit41 and overvåget then
<**> begin
<**> skriv_vt_opd(out,0);
<**> write(out,<: modtaget operation:>);
<**> skriv_op(out,op);
<**> end;
<*-2*>
<*+4*>
<**>if op<>vt_op then
<**>begin
<**> disable begin
<**> fejlreaktion(11,op,<:vt-opdater:>,1);
<**> d.op.resultat:= 31; <*systemfejl*>
<**> signalch(d.op.retur,op,d.op.optype);
<**> end;
<**> goto vent_op;
<**>end;
<*-4*>
disable
begin integer opk;
opk:= d.op.opkode extract 12;
funk:= if opk=11 then 1 else
if opk=12 then 2 else
if opk=13 then 3 else
if opk=19 then 4 else
if opk=20 then 5 else
if opk=24 then 6 else
0;
if funk=0 then fejlreaktion( 2,opk,<:vt_opdater:>,0);
end;
res:= 0;
goto case funk of (indsæt,udtag,omkod,slet,flyt,roker);
\f
message procedure vt_opdater side 3 - 820301/cl;
indsæt:
begin
integer busnr,ll_id,ll1,omr,gar,sig,tilst,bi,li,s,zi;
<*+4*>
<**> if d.op.data(1) shift (-22) <> 0 then
<**> begin
<**> res:= 31; fejlreaktion(10,d.op.data(1),<:indsæt busnr:>,1);
<**> goto slut_indsæt;
<**> end;
<*-4*>
busnr:= d.op.data(1) extract 14;
<*+4*>
<**> if d.op.data(2) shift (-22) <> 1 then
<**> begin
<**> res:= 31; fejlreaktion(10,d.op.data(2),<:indsæt linie/løb:>,1);
<**> goto slut_indsæt;
<**> end;
<*-4*>
ll_id:= d.op.data(2);
s:= omr:= d.op.data(4) extract 8;
bi:= søg_omr_bus(busnr,ll1,gar,omr,sig,tilst);
if bi<0 then
begin
if bi=(-1) then res:=10 <*bus ukendt*> else
if s<>0 then res:= 58 <*ulovligt omr*> else res:= 57 <*omr nødv.*>;
end
else
if s<>0 and s<>omr then
res:= 58 <* ulovligt område for bus *>
else
if intg(bustilstand(bi)) <> 0 then
res:=(if intg(bustilstand(bi))=(-1) then 18 <* i kø *>
else 14 <* optaget *>)
else
begin
if linie_løb_indeks(bi) extract 12 <> 0 then
begin <* linie/løb allerede indsat *>
res:= 11;
d.op.data(3):= linie_løb_tabel(linie_løb_indeks(bi) extract 12);
end
else
begin
\f
message procedure vt_opdater side 3a - 900108/cl;
if d.op.kilde//100 <> 4 then
res:= opd_omr(11,gar shift 8 +
bustabel1(bi) extract 8,busnr,ll_id);
if res>3 then goto slut_indsæt;
s:= binærsøg(sidste_linie_løb,linie_løb_tabel(li) - ll_id,li);
if s=0 then <* linie/løb findes allerede *>
disable
begin
sig:= busindeks(li) extract 12;
d.op.data(3):= bustabel(sig);
linie_løb_indeks(sig):= false;
modiffil(tf_vogntabel,sig,zi);
fil(zi).ll:= 0;
fil(zi).bn:= bustabel(sig) extract 14 add
(bustabel1(sig) extract 8 shift 14);
linie_løb_indeks(bi):= false add li;
busindeks(li):= false add bi;
modiffil(tf_vogntabel,bi,zi);
fil(zi).ll:= ll_id;
fil(zi).bn:= bustabel(bi) extract 14 add
(bustabel1(bi) extract 8 shift 14);
res:= 3;
end
else
begin
\f
message procedure vt_opdater side 4 - 810527/cl;
if s<0 then li:= li +1;
if sidste_linie_løb=max_antal_linie_løb then
begin
fejlreaktion(10,max_antal_linie_løb,<:for mange linie/løb:>,1);
res:= 31;
end
else
disable
begin
for i:= sidste_linie_løb step -1 until li do
begin
linie_løb_tabel(i+1):=linie_løb_tabel(i);
linie_løb_indeks(bus_indeks(i) extract 12):=false add (i+1);
bus_indeks(i+1):=bus_indeks(i);
end;
sidste_linie_løb:= sidste_linie_løb +1;
linie_løb_tabel(li):= ll_id;
linie_løb_indeks(bi):= false add li;
busindeks(li):= false add bi;
s:= modiffil(tf_vogntabel,bi,zi);
if s<>0 then fejlreaktion(7,s,<:vt_indsæt:>,0);
fil(zi).bn:= busnr extract 14 add
(bustabel1(bi) extract 8 shift 14);
fil(zi).ll:= ll_id;
res:= 3; <* ok *>
end;
end;
end;
end;
slut_indsæt:
d.op.resultat:= res;
end;
goto returner;
\f
message procedure vt_opdater side 5 - 820301/cl;
udtag:
begin
integer busnr,ll_id,omr,gar,sig,bi,li,s,format,tilst,zi;
busnr:= ll_id:= 0;
omr:= s:= d.op.data(2) extract 8;
format:= d.op.data(1) shift (-22);
if format=0 then <*busnr*>
begin
busnr:= d.op.data(1) extract 14;
bi:= søg_omr_bus(busnr,ll_id,gar,omr,sig,tilst);
if bi<0 then
begin
if bi=-1 then res:= 10 else
if s<>0 then res:= 58 else res:= 57;
goto slut_udtag;
end;
if bi>0 and s<>0 and s<>omr then
begin
res:= 58; goto slut_udtag;
end;
li:= linie_løb_indeks(bi) extract 12;
busnr:= bustabel(bi);
if li=0 or linie_løb_tabel(li)=0 then
begin <* bus ej indsat *>
res:= 13;
goto slut_udtag;
end;
ll_id:= linie_løb_tabel(li);
end
else
if format=1 then <* linie_løb *>
begin
ll_id:= d.op.data(1);
s:= binærsøg(sidste_linie_løb,linie_løb_tabel(li)-ll_id,li);
if s<>0 then
begin <* linie/løb findes ikke *>
res:= 9;
goto slut_udtag;
end;
bi:= busindeks(li) extract 12;
busnr:= bustabel(bi);
end
else <* ulovlig identifikation *>
begin
res:= 31;
fejlreaktion(10,d.op.data(1),<:udtag ident:>,1);
goto slut_udtag;
end;
\f
message procedure vt_opdater side 6 - 820301/cl;
tilst:= intg(bustilstand(bi));
if tilst<>0 then
begin
res:= if tilst = -1 then 18<*i kø*> else 14<*optaget*>;
goto slut_udtag;
end;
if d.op.kilde//100 <> 4 then
res:= opd_omr(12, bustabel(bi) shift (-14) extract 8 shift 8 +
bustabel1(bi) extract 8,bustabel(bi) extract 14,0);
if res>3 then goto slut_udtag;
linie_løb_indeks(bi):= false;
for i:= li step 1 until sidste_linie_løb -1 do
begin
linie_løb_tabel(i):= linie_løb_tabel(i+1);
linie_løb_indeks(bus_indeks(i+1) extract 12):= false add i;
bus_indeks(i):= bus_indeks(i+1);
end;
linie_løb_tabel(sidste_linie_løb):= 0;
bus_indeks(sidste_linie_løb):= false;
sidste_linie_løb:= sidste_linie_løb -1;
disable s:= modif_fil(tf_vogntabel,bi,zi);
if s<>0 then fejlreaktion(7,s,<:vt_udtag:>,0);
fil(zi).ll:= 0;
fil(zi).bn:= busnr add (bustabel1(bi) extract 8 shift 14);
res:= 3; <* ok *>
slut_udtag:
d.op.resultat:= res;
d.op.data(2):= ll_id;
d.op.data(3):= busnr;
end;
goto returner;
\f
message procedure vt_opdater side 7 - 851001/cl;
omkod:
flyt:
roker:
begin
integer ll_id1,ll_id2,inf1,inf2,i,s,bi1,bi2,li1,li2,tilst,zi,pm1;
inf1:= inf2:= 0;
ll_id1:= d.op.data(1);
ll_id2:= d.op.data(2);
if ll_id1=ll_id2 then
begin
res:= 24; inf1:= ll_id2;
goto slut_flyt;
end;
<*+4*>
<**> for i:= 1,2 do
<**> if d.op.data(i) shift (-22) <> 1 then
<**> begin
<**> res:= 31;
<**> fejlreaktion(10,d.op.data(i),case i of (
<**> <:omkod/flyt/roker ident1:>,<:omkod/flyt/roker ident2:>),1);
<**> goto slut_flyt;
<**> end;
<*-4*>
s:= binærsøg(sidste_linie_løb,linie_løb_tabel(li1) - ll_id1,li1);
if s<>0 and funk=6 <* roker *> then
begin
i:= ll_id1; ll_id1:= ll_id2; ll_id2:= i;
s:= binærsøg(sidste_linie_løb,linie_løb_tabel(li1) - ll_id1,li1);
end;
if s<>0 then
begin
res:= 9; <* ukendt linie/løb *>
goto slut_flyt;
end;
bi1:= busindeks(li1) extract 12;
inf1:= bustabel(bi1);
tilst:= intg(bustilstand(bi1));
if tilst<>0 then <* bus ikke fri *>
begin
res:= if tilst=-1 then 18 <* i kø *> else 14 <*optaget*>;
goto slut_flyt;
end;
\f
message procedure vt_opdater side 7a- 851001/cl;
if d.op.kilde//100 <> 4 then
res:= opd_omr(11, bustabel(bi1) shift (-14) extract 8 shift 8 +
bustabel1(bi1) extract 8, inf1 extract 14, ll_id2);
if res>3 then goto slut_flyt;
s:= binærsøg(sidste_linie_løb,linie_løb_tabel(li2) - ll_id2,li2);
if s=0 then
begin <* ll_id2 er indkodet *>
bi2:= busindeks(li2) extract 12;
inf2:= bustabel(bi2);
tilst:= intg(bustilstand(bi2));
if funk=3 then res:= 12 <* ulovlig ved omkod *> else
if tilst=-1 then res:= 18 else if tilst<>0 then res:= 14;
if res>3 then
begin
inf1:= inf2; inf2:= 0;
goto slut_flyt;
end;
if d.op.kilde//100 <> 4 then
res:= opd_omr(11, bustabel(bi2) shift (-14) extract 8 shift 8 +
bustabel1(bi2) extract 8, inf2 extract 14, ll_id1);
if res>3 then goto slut_flyt;
<* flyt bus *>
if funk=6 then
linie_løb_indeks(bi2):= false add li1
else
linie_løb_indeks(bi2):= false;
linie_løb_indeks(bi1):= false add li2;
if funk=6 then
busindeks(li1):= false add bi2
else
busindeks(li1):= false;
busindeks(li2):= false add bi1;
if funk<>6 then
begin
<* fjern ll_id1 *>
for i:= li1 step 1 until sidste_linie_løb - 1 do
begin
linie_løb_tabel(i):= linie_løb_tabel(i+1);
linie_løb_indeks(intg(busindeks(i+1))):= false add i;
busindeks(i):= busindeks(i+1);
end;
linie_løb_tabel(sidste_linie_løb):= 0;
bus_indeks(sidste_linie_løb):= false;
sidste_linie_løb:= sidste_linie_løb-1;
end;
<* opdater vogntabelfil *>
disable s:= modiffil(tf_vogntabel,bi2,zi);
if s<>0 then fejlreaktion(7,s,<:vt-omkod/flyt:>,0);
fil(zi).ll:= if funk=6 then ll_id1 else 0;
fil(zi).bn:= inf2 extract 14 add (bustabel1(bi2) extract 8 shift 14);
<*
fil(zi).ll:= 0; fil(zi).bn:= inf2;
*>
disable s:= modiffil(tf_vogntabel,bi1,zi);
if s<>0 then fejlreaktion(7,s,<:vt-omkod/flyt:>,0);
fil(zi).ll:= ll_id2;
fil(zi).bn:= inf1 extract 14 add (bustabel1(bi1) extract 8 shift 14);
\f
message procedure vt_opdater side 8 - 820301/cl;
end <* ll_id2 indkodet *>
else
begin
if sign(s)=sign(li2-li1) then li2:=li2-sign(s);
<* li2 skal være indeks for sidste linie/løb der skal flyttes i vt *>
pm1:= sgn(li2-li1);
for i:= li1 step pm1 until li2-pm1 do
begin
linie_løb_tabel(i):= linie_løb_tabel(i+pm1);
busindeks(i):= busindeks(i+pm1);
linie_løb_indeks(intg(busindeks(i+pm1))):= false add i;
end;
linie_løb_tabel(li2):= ll_id2;
busindeks(li2):= false add bi1;
linie_løb_indeks(bi1):= false add li2;
disable s:= modiffil(tf_vogntabel,bi1,zi);
if s<>0 then fejlreaktion(7,s,<:vt-omkod/flyt:>,0);
fil(zi).ll:= ll_id2;
fil(zi).bn:= inf1 extract 14 add (bustabel1(bi1) extract 8 shift 14);
end;
res:= 3; <*udført*>
slut_flyt:
d.op.resultat:= res;
d.op.data(3):= inf1;
if funk=5 then d.op.data(4):= inf2;
end;
goto returner;
\f
message procedure vt_opdater side 9 - 851001/cl;
slet:
begin
integer flin,slin,finx,sinx,s,li,bi,omr,gar;
boolean test24;
if d.op.data(2)=0 then d.op.data(2):= d.op.data(1);
omr:= d.op.data(3);
if d.op.data(1) > d.op.data(2) then
begin
res:= 44; <* intervalstørrelse ulovlig *>
goto slut_slet;
end;
for bi:= 1 step 1 until max_antal_garager do
begin
if garageomr(bi) > 0 then
begin
if omr=0 or omr=bi or (omr<0 and
omr extract 8 = garageomr(bi)) then
begin
if d.op.kilde//100 <> 4 then
res:= opd_omr(19, bi shift 8 + garageomr(bi), 0, 0);
if res>3 then goto slut_slet;
end;
end;
end;
flin:= (1 shift 22) + (d.op.data(1) extract 21 shift 7);
slin:= (1 shift 22) + (d.op.data(2) extract 21 shift 7) + 127;
s:= binærsøg(sidste_linie_løb, (linie_løb_tabel(finx)-flin), finx);
if s<0 then finx:= finx+1;
s:= binærsøg(sidste_linie_løb, (linie_løb_tabel(sinx)-slin), sinx);
if s>0 then sinx:= sinx-1;
for li:= finx step 1 until sinx do
begin
bi:= busindeks(li) extract 12;
gar:= bustabel(bi) shift (-14) extract 8;
if intg(bustilstand(bi))=0 and
(omr = 0 or (omr > 0 and omr = gar) or
(omr < 0 and omr extract 8 = bustabel1(bi) extract 8)) then
begin
linie_løb_indeks(bi):= busindeks(li):= false;
linie_løb_tabel(li):= 0;
end;
end;
\f
message procedure vt_opdater side 10 - 850820/cl;
sinx:= finx-1;
for li:= finx step 1 until sidste_linie_løb do
begin
if linie_løb_tabel(li)<>0 then
begin
sinx:= sinx+1;
if sinx<>li then
begin
linie_løb_tabel(sinx):= linie_løb_tabel(li);
busindeks(sinx):= busindeks(li);
linie_løb_indeks(busindeks(sinx) extract 12):= false add sinx;
linie_løb_tabel(li):= 0;
busindeks(li):= false;
end;
end;
end;
sidste_linie_løb:= sinx;
test24:= testbit24; testbit24:= false;
for bi:= 1 step 1 until sidste_bus do
disable
begin
s:= modiffil(tf_vogntabel,bi,finx);
if s<>0 then fejlreaktion(7,s,<:vt-slet:>,0);
fil(finx).bn:= bustabel(bi) extract 14 add
(bustabel1(bi) extract 8 shift 14);
fil(finx).ll:= linie_løb_tabel(linie_løb_indeks(bi) extract 12);
end;
testbit24:= test24;
res:= 3;
slut_slet:
d.op.resultat:= res;
end;
goto returner;
\f
message procedure vt_opdater side 11 - 810409/cl;
returner:
disable
begin
<*+2*>
<**> if testbit40 and overvåget then
<**> begin
<**> skriv_vt_opd(out,0);
<**> write(out,<: vogntabel efter ændring:>);
<**> p_vogntabel(out);
<**> end;
<**> if testbit41 and overvåget then
<**> begin
<**> skriv_vt_opd(out,0);
<**> write(out,<: returner operation:>);
<**> skriv_op(out,op);
<**> end;
<*-2*>
signalch(d.op.retur,op,d.op.optype);
end;
goto vent_op;
vt_opd_trap:
disable skriv_vt_opd(zbillede,1);
end vt_opdater;
\f
message procedure vt_tilstand side 1 - 810424/cl;
procedure vt_tilstand(cs_fil,fil_opref);
value cs_fil,fil_opref;
integer cs_fil,fil_opref;
begin
integer array field op,filop;
integer funk,format,busid,res,bi,tilst,opk,opk_indeks,
g_type,gr,antal,ej_res,zi,li,filref;
integer array identer(1:max_antal_i_gruppe);
procedure skriv_vt_tilst(zud,omfang);
value omfang;
zone zud;
integer omfang;
begin
real array field raf;
raf:= 0;
write(zud,"nl",1,<:+++ vt_tilstand :>);
if omfang <> 0 then
begin
skriv_coru(zud,abs curr_coruno);
write(zud,"nl",1,<<d>,
<:cs-fil :>,cs_fil,"nl",1,
<:filop :>,filop,"nl",1,
<:op :>,op,"nl",1,
<:funk :>,funk,"nl",1,
<:format :>,format,"nl",1,
<:busid :>,busid,"nl",1,
<:res :>,res,"nl",1,
<:bi :>,bi,"nl",1,
<:tilst :>,tilst,"nl",1,
<:opk :>,opk,"nl",1,
<:opk-indeks :>,opk_indeks,"nl",1,
<:g-type :>,g_type,"nl",1,
<:gr :>,gr,"nl",1,
<:antal :>,antal,"nl",1,
<:ej-res :>,ej_res,"nl",1,
<:zi :>,zi,"nl",1,
<:li :>,li,"nl",1,
<::>);
write(zud,"nl",1,<:identer:>);
skriv_hele(zud,identer.raf,max_antal_i_gruppe*2,2);
end;
end;
procedure sorter_gruppe(tab,l,u);
value l,u;
integer array tab;
integer l,u;
begin
integer array field ii,jj,xx;
integer array ww(1:2);
ii:= (l-1)*4; jj:= (u-1)*4;
xx:= ((l+u)//2 - 1)*4;
repeat
while
(tab.ii(1) shift (-8) extract 4 < tab.xx(1) shift (-8) extract 4)
or
(tab.ii(1) shift (-18) > tab.xx(1) shift (-18) and
tab.ii(1) shift (-12) extract 6 < tab.xx(1) shift (-12) extract 6)
do ii:= ii+4;
while
(tab.xx(1) shift(-8) extract 4 < tab.jj(1) shift(-8) extract 4)
or
(tab.xx(1) shift (-18) > tab.jj(1) shift (-18) and
tab.xx(1) shift (-12) extract 6 < tab.jj(1) shift (-12) extract 6)
do jj:= jj-4;
if ii <= jj then
begin
tofrom(ww,tab.ii,4);
tofrom(tab.ii,tab.jj,4);
tofrom(tab.jj,ww,4);
ii:= ii+4;
jj:= jj-4;
end;
until ii>jj;
if l < jj//4+1 then sorter_gruppe(tab,l,jj//4+1);
if ii//4+1 < u then sorter_gruppe(tab,ii//4+1,u);
end;
\f
message procedure vt_tilstand side 2 - 820301/cl;
filop:= filopref;
stackclaim(if cm_test then 198 else 146);
trap(vt_tilst_trap);
<*+2*>
<**> disable if testbit47 and overvåget or testbit28 then
<**> skriv_vt_tilst(out,0);
<*-2*>
vent_op:
waitch(cs_vt_tilst,op,vt_optype or gen_optype,-1);
<*+2*>disable
<**> if testbit41 and overvåget then
<**> begin
<**> skriv_vt_tilst(out,0);
<**> write(out,<: modtaget operation:>);
<**> skriv_op(out,op);
<**> end;
<*-2*>
<*+4*>
<**> if op <> vt_op then
<**> begin
<**> disable begin
<**> d.op.resultat:= 31;
<**> fejlreaktion(11,op,<:vt-tilstand:>,1);
<**> end;
<**> goto returner;
<**> end;
<*-4*>
opk:= d.op.opkode extract 12;
funk:= if opk = 14 <*bus i kø*> then 1 else
if opk = 15 <*bus res *> then 2 else
if opk = 16 <*grp res *> then 4 else
if opk = 17 <*bus fri *> then 3 else
if opk = 18 <*grp fri *> then 5 else
0;
if funk = 0 then fejlreaktion(2,opk,<:vt_tilstand:>,0);
res:= 0;
format:= d.op.data(1) shift (-22);
goto case funk of(enkelt_bus,enkelt_bus,enkelt_bus,grp_res,grp_fri);
\f
message procedure vt_tilstand side 3 - 820301/cl;
enkelt_bus:
<* sæt enkelt bus i kø, reserver eller frigiv enkelt bus *>
disable
begin integer busnr,i,s,tilst,ll,gar,omr,sig;
<*+4*>
<**>if format <> 0 and format <> 1 then
<**>begin
<**> res:= 31;
<**> fejlreaktion(10,d.op.data(1),<:tilstand ident:>,1);
<**> goto slut_enkelt_bus;
<**>end;
<*-4*>
<* find busnr og tilstand *>
case format+1 of
begin
<* 0: budident *>
begin
busnr:= d.op.data(1) extract 14;
s:= omr:= d.op.data(4) extract 8;
bi:= søg_omr_bus(busnr,ll,gar,omr,sig,tilst);
if bi<0 then
begin
res:= if bi=(-1) then 10 else (if s<>0 then 58 else 57);
goto slut_enkelt_bus;
end
else
begin
tilst:= intg(bustilstand(bi));
end;
end;
<* 1: linie_løb_ident *>
begin
bi:= findbusnr(d.op.data(1),busnr,i,tilst);
if bi < 0 then <* ukendt linie_løb *>
begin
res:= 9;
goto slut_enkelt_bus;
end;
end;
end case;
\f
message procedure vt_tilstand side 4 - 830310/cl;
if funk < 3 then
begin
d.op.data(2):= if linie_løb_indeks(bi) extract 12 <> 0 then
linie_løb_tabel(linie_løb_indeks(bi) extract 12)
else 0;
d.op.data(3):= bustabel(bi);
d.op.data(4):= bustabel1(bi);
end;
<* check tilstand *>
if funk = 3 <*frigiv*> and tilst >= 0 <*fri/optaget_i_gruppe*> then
res:= 39 <* bus ikke reserveret *>
else
if tilst <> 0 and tilst <> (-1) and funk < 3 then
res:= 14 <* bus optaget *>
else
if funk = 1 <* i kø *> and tilst = (-1) then
res:= 18 <* i kø *>
else
res:= 3; <*udført*>
if res = 3 then
bustilstand(bi):= false add (case funk of (-1,-2,0));
slut_enkelt_bus:
d.op.resultat:= res;
end <*disable*>;
goto returner;
\f
message procedure vt_tilstand side 5 - 810424/cl;
grp_res: <* reserver gruppe *>
disable
begin
<*+4*>
<**> if format <> 2 then
<**> begin
<**> res:= 31;
<**> fejlreaktion(10,d.op.data(1),<:tilstand ident:>,1);
<**> goto slut_grp_res_1;
<**> end;
<*-4*>
<* find frit indeks i opkaldstabel *>
opk_indeks:= 0;
for i:= max_antal_gruppeopkald step -1 until 1 do
begin
if gruppeopkald(i,1)=0 then opk_indeks:= i <*fri plads*> else
if gruppeopkald(i,1)=d.op.data(1) then res:= 15 <*optaget*>;
end;
if opk_indeks = 0 then res:= 32; <* ingen plads *>
if res <> 0 then goto slut_grp_res_1;
g_type:= d.op.data(1) shift (-21) extract 1;
if g_type = 1 <*special gruppe*> then
begin <*check eksistens*>
gr:= 0;
for i:= 1 step 1 until max_antal_grupper do
if gruppetabel(i) = d.op.data(1) then gr:= i;
if gr = 0 then <*gruppe ukendt*>
begin
res:= 8;
goto slut_grp_res_1;
end;
end;
<* reserver i opkaldstabel *>
gruppeopkald(opk_indeks,1):= d.op.data(1);
\f
message procedure vt_tilstand side 6 - 810428/cl;
<* tilknyt fil *>
start_operation(filop,curr_coruid,cs_fil,101);
d.filop.data(1):= 0; <*postantal*>
d.filop.data(2):= 256; <*postlængde*>
d.filop.data(3):= 1; <*segmentantal*>
d.filop.data(4):= 2 shift 10; <*spool fil*>
signalch(cs_opret_fil,filop,vt_optype);
slut_grp_res_1:
if res <> 0 then d.op.resultat:= res;
end;
if res <> 0 then goto returner;
waitch(cs_fil,filop,vt_optype,-1);
<* check filsys-resultat *>
if d.filop.data(9) <> 0 then
fejlreaktion(13,d.filop.data(9),<:gruppe,res:>,0);
filref:= d.filop.data(4);
\f
message procedure vt_tilstand side 7 - 820301/cl;
disable if g_type = 0 <*linie-gruppe*> then
begin
integer s,i,ll_id;
integer array field iaf1;
ll_id:= 1 shift 22 + d.op.data(1) shift 7;
iaf1:= 0;
s:= binærsøg(sidste_linie_løb,
linie_løb_tabel(i) - ll_id, i);
if s < 0 then i:= i +1;
antal:= ej_res:= 0;
skrivfil(filref,1,zi);
if i <= sidste_linie_løb then
begin
while linie_løb_tabel(i) shift (-7) shift 7 = ll_id do
begin
if (intg(bustilstand(intg(busindeks(i))))<>0) or
(bustabel1(intg(busindeks(i))) extract 8 <> 3) then
ej_res:= ej_res+1
else
begin
antal:= antal+1;
bi:= busindeks(i) extract 12;
fil(zi).iaf1(1):=
område_id( bustabel1(bi) extract 8, 2) extract 12 shift 12 +
(bustabel1(bi) shift (-23) + 1) shift 8 + 1;
fil(zi).iaf1(2):= bustabel(bi);
iaf1:= iaf1+4;
bustilstand(bi):= false add opk_indeks;
end;
i:= i +1;
if i > sidste_linie_løb then goto slut_l_grp;
end;
end;
\f
message procedure vt_tilstand side 8 - 820301/cl;
slut_l_grp:
end
else
begin <*special gruppe*>
integer i,s,li,omr,gar,tilst;
integer array field iaf1;
iaf1:= 0;
antal:= ej_res:= 0;
s:= læsfil(tf_gruppedef,gr,zi);
if s <> 0 then fejlreaktion(5,s,<:gruppe,res:>,0);
tofrom(identer,fil(zi),max_antal_i_gruppe*2);
s:= skrivfil(filref,1,zi);
if s<>0 then fejlreaktion(6,s,<:gruppe,res:>,0);
i:= 1;
while identer(i) <> 0 do
begin
if identer(i) shift (-22) = 0 then
begin <*busident*>
omr:= 0;
bi:= søg_omr_bus(identer(i),li,gar,omr,s,tilst);
if bi<0 then goto næste_ident;
li:= linie_løb_indeks(bi) extract 12;
end
else
begin <*linie/løb ident*>
s:= binærsøg(sidste_linie_løb,
linie_løb_tabel(li) - identer(i), li);
if s <> 0 then goto næste_ident;
bi:= busindeks(li) extract 12;
end;
if (intg(bustilstand(bi))<>0) or
(bustabel1(bi) extract 8 <> 3) then
ej_res:= ej_res+1
else
begin
antal:= antal +1;
fil(zi).iaf1(1):=
område_id( bustabel1(bi) extract 8, 2) extract 12 shift 12 +
(bustabel1(bi) shift (-23) + 1) shift 8 + 1;
fil(zi).iaf1(2):= bustabel(bi);
iaf1:= iaf1+4;
bustilstand(bi):= false add opk_indeks;
end;
næste_ident:
i:= i +1;
if i > max_antal_i_gruppe then goto slut_s_grp;
end;
slut_s_grp:
end;
\f
message procedure vt_tilstand side 9 - 820301/cl;
if antal > 0 then <*ok*>
disable begin
integer array field spec,akt;
integer a,antal_spec;
antal_spec:= 0; a:= 0;
spec:= 0; akt:= 0;
sorter_gruppe(fil(zi).spec,1,antal);
while akt//4 < antal do
begin
fil(zi).spec(1):= fil(zi).akt(1) shift (-8) shift 8;
a:= 0;
while fil(zi).akt(1) shift (-8) = fil(zi).spec(1) shift (-8)
and a<15 do
begin
a:= a+1;
fil(zi).spec(1+a):= fil(zi).akt(2) extract 14;
akt:= akt+4;
end;
fil(zi).spec(1):= fil(zi).spec(1) + a;
antal_spec:= antal_spec+1;
spec:= spec + 2*a + 2;
end;
antal:= antal_spec;
gruppeopkald(opk_indeks,2):= filref;
d.op.resultat:= 3;
d.op.data(2):= antal;
d.op.data(3):= filref;
d.op.data(4):= ej_res;
d.filop.data(1):= antal;
disable sæt_fil_dim(d.filop.data);
end
else
begin
disable begin
d.filop.opkode:= 104; <*slet fil*>
signalch(cs_slet_fil,filop,vt_optype);
gruppeopkald(opk_indeks,1):= 0; <*fri*>
d.op.resultat:= 54;
d.op.data(2):= antal;
d.op.data(3):= 0;
d.op.data(4):= ej_res;
end;
waitch(cs_fil,filop,vt_optype,-1);
if d.filop.data(9) <> 0 then
fejlreaktion(16,d.filop.data(9),<:gruppe,res:>,0);
end;
goto returner;
\f
message procedure vt_tilstand side 10 - 820301/cl;
grp_fri: <* frigiv gruppe *>
disable
begin integer i,j,s,ll,gar,omr,tilst;
integer array field spec;
<*+4*>
<**> if format <> 2 then
<**> begin
<**> res:= 31;
<**> fejlreaktion(10,d.op.data(1),<:tilstand ident:>,1);
<**> goto slut_grp_fri;
<**> end;
<*-4*>
<* find indeks i opkaldstabel *>
opk_indeks:= 0;
for i:= 1 step 1 until max_antal_gruppeopkald do
if gruppeopkald(i,1) = d.op.data(1) then opk_indeks:= i;
if opk_indeks = 0 <*ikke fundet*> then
begin
res:= 40; <*gruppe ej reserveret*>
goto slut_grp_fri;
end;
filref:= gruppeopkald(opk_indeks,2);
start_operation(filop,curr_coruid,cs_fil,104);
d.filop.data(4):= filref;
hentfildim(d.filop.data);
antal:= d.filop.data(1);
læsfil(filref,1,zi);
spec:= 0;
for i:= 1 step 1 until antal do
begin
for j:= 1 step 1 until fil(zi).spec(1) extract 8 do
begin
busid:= fil(zi).spec(1+j) extract 14;
omr:= 0;
bi:= søg_omr_bus(busid,ll,gar,omr,s,tilst);
if bi>=0 then bustilstand(bi):= false;
end;
spec:= spec + 2*(fil(zi).spec(1) extract 8) + 2;
end;
slut_grp_fri:
d.op.resultat:= res;
end;
if res <> 0 then goto returner;
gruppeopkald(opk_indeks,1):= gruppeopkald(opk_indeks,2):= 0;
signalch(cs_slet_fil,filop,vt_optype);
\f
message procedure vt_tilstand side 11 - 810424/cl;
waitch(cs_fil,filop,vt_optype,-1);
if d.filop.data(9) <> 0 then
fejlreaktion(16,d.filop.data(9),<:gruppe,fri:>,0);
d.op.resultat:= 3;
returner:
disable
begin
<*+2*>
<**> if testbit40 and overvåget then
<**> begin
<**> skriv_vt_tilst(out,0);
<**> write(out,<: vogntabel efter ændring:>);
<**> p_vogntabel(out);
<**> end;
<**> if testbit43 and overvåget and (funk=4 or funk=5) then
<**> begin
<**> skriv_vt_tilst(out,0); write(out,<: gruppetabel efter ændring:>);
<**> p_gruppetabel(out);
<**> end;
<**> if testbit41 and overvåget then
<**> begin
<**> skriv_vt_tilst(out,0);
<**> write(out,<: returner operation:>);
<**> skriv_op(out,op);
<**> end;
<*-2*>
signalch(d.op.retur,op,d.op.optype);
end;
goto vent_op;
vt_tilst_trap:
disable skriv_vt_tilst(zbillede,1);
end vt_tilstand;
\f
message procedure vt_rapport side 1 - 810428/cl;
procedure vt_rapport(cs_fil,fil_opref);
value cs_fil,fil_opref;
integer cs_fil,fil_opref;
begin
integer array field op,filop;
integer funk,filref,antal,id_ant,res;
integer field i1,i2;
procedure skriv_vt_rap(z,omfang);
value omfang;
zone z;
integer omfang;
begin
write(z,"nl",1,<:+++ vt_rapport :>);
if omfang <> 0 then
begin
skriv_coru(z,abs curr_coruno);
write(z,"nl",1,<<d>,
<: cs_fil :>,cs_fil,"nl",1,
<: filop :>,filop,"nl",1,
<: op :>,op,"nl",1,
<: funk :>,funk,"nl",1,
<: filref :>,filref,"nl",1,
<: antal :>,antal,"nl",1,
<: id-ant :>,id_ant,"nl",1,
<: res :>,res,"nl",1,
<::>);
end;
end skriv_vt_rap;
stackclaim(if cm_test then 198 else 146);
filop:= fil_opref;
i1:= 2; i2:= 4;
trap(vt_rap_trap);
<*+2*>
<**> disable if testbit47 and overvåget or testbit28 then
<**> skriv_vt_rap(out,0);
<*-2*>
\f
message procedure vt_rapport side 2 - 810505/cl;
vent_op:
waitch(cs_vt_rap,op,gen_optype or vt_optype,-1);
<*+2*>
<**> disable begin
<**> if testbit41 and overvåget then
<**> begin
<**> skriv_vt_rap(out,0);
<**> write(out,<: modtaget operation:>);
<**> skriv_op(out,op);
<**> ud;
<**> end;
<**> end;<*disable*>
<*-2*>
disable
begin
integer opk;
opk:= d.op.opkode extract 12;
funk:= if opk = 9 then 1 else
if opk =10 then 2 else
0;
if funk = 0 then fejlreaktion(2,opk,<:vt_gruppe:>,0);
<* opret og tilknyt fil *>
start_operation(filop,curr_coruid,cs_fil,101);
d.filop.data(1):= 0; <*postantal(midlertidigt)*>
d.filop.data(2):= 2; <*postlængde*>
d.filop.data(3):=10; <*segmenter*>
d.filop.data(4):= 2 shift 10; <*spool fil*>
signalch(cs_opretfil,filop,vt_optype);
end;
waitch(cs_fil,filop,vt_optype,-1);
<* check resultat *>
if d.filop.data(9) <> 0 then
fejlreaktion(13,d.filop.data(9),<:vt-rapport:>,0);
filref:= d.filop.data(4);
antal:= 0;
goto case funk of (l_rapport,b_rapport);
\f
message procedure vt_rapport side 3 - 850820/cl;
l_rapport:
disable
begin
integer i,j,s,ll,zi;
idant:= 0;
for id_ant:= id_ant+1 while d.op.data(id_ant)<>0 and id_ant<5 do
<*+4*>
<**> if d.op.data(id_ant) shift (-22) <> 2 then
<**> begin
<**> res:= 31;
<**> fejlreaktion(10,d.op.data(id_ant),<:l-rapport ident:>,1);
<**> goto l_rap_slut;
<**> end;
<*-4*>
;
for i:= 1 step 1 until id_ant do
begin
ll:= (1 shift 22) + d.op.data(i) extract 15 shift 7;
s:= binærsøg(sidste_linie_løb,
linie_løb_tabel(j) - ll, j);
if s < 0 then j:= j +1;
if j<= sidste_linie_løb then
begin <* skriv identer *>
while linie_løb_tabel(j) shift (-7) shift 7 = ll do
begin
antal:= antal +1;
s:= skrivfil(filref,antal,zi);
if s <> 0 then fejlreaktion(6,s,<:vt_rapport:>,0);
fil(zi).i1:= linie_løb_tabel(j);
fil(zi).i2:= bustabel(busindeks(j) extract 12);
j:= j +1;
if j > sidste_bus then goto linie_slut;
end;
end;
linie_slut:
end;
res:= 3;
l_rap_slut:
end <*disable*>;
goto returner;
\f
message procedure vt_rapport side 4 - 820301/cl;
b_rapport:
disable
begin
integer i,j,s,zi,busnr1,busnr2;
<*+4*>
<**> for i:= 1,2 do
<**> if d.op.data(i) shift (-14) <> 0 then
<**> begin
<**> res:= 31;
<**> fejlreaktion(10,d.op.data(i),<:b-rapport ident:>,1);
<**> goto bus_slut;
<**> end;
<*-4*>
busnr1:= d.op.data(1) extract 14;
busnr2:= if d.op.data(2) = 0 then busnr1 else d.op.data(2) extract 14;
if busnr1 = 0 or busnr2 < busnr1 then
begin
res:= 7; <* fejl i busnr *>
goto bus_slut;
end;
s:= binærsøg(sidste_bus,bustabel(j) extract 14
- busnr1,j);
if s < 0 then j:= j +1;
while j>1 and bustabel(j-1) extract 14 >= busnr1 do j:= j-1;
if j <= sidste_bus then
begin <* skriv identer *>
while bustabel(j) extract 14 <= busnr2 do
begin
i:= linie_løb_indeks(j) extract 12;
if i<>0 then
begin
antal:= antal +1;
s:= skriv_fil(filref,antal,zi);
if s <> 0 then fejlreaktion(6,s,<:vt-rapport:>,0);
fil(zi).i1:= bustabel(j);
fil(zi).i2:= linie_løb_tabel(i);
end;
j:= j +1;
if j > sidste_bus then goto bus_slut;
end;
end;
bus_slut:
end <*disable*>;
res:= 3; <*ok*>
\f
message procedure vt_rapport side 5 - 810409/cl;
returner:
disable
begin
d.op.resultat:= res;
d.op.data(6):= antal;
d.op.data(7):= filref;
d.filop.data(1):= antal;
d.filop.data(3):= (antal*d.filop.data(2) -1)//256 +1;
i:= sæt_fil_dim(d.filop.data);
if i <> 0 then fejlreaktion(9,i,<:vt-rapport:>,0);
<*+2*>
<**> if testbit41 and overvåget then
<**> begin
<**> skriv_vt_rap(out,0);
<**> write(out,<: returner operation:>);
<**> skriv_op(out,op);
<**> end;
<*-2*>
signalch(d.op.retur,op,d.op.optype);
end;
goto vent_op;
vt_rap_trap:
disable skriv_vt_rap(zbillede,1);
end vt_rapport;
\f
message procedure vt_gruppe side 1 - 810428/cl;
procedure vt_gruppe(cs_fil,fil_opref);
value cs_fil,fil_opref;
integer cs_fil,fil_opref;
begin
integer array field op, fil_op, iaf;
integer funk, res, filref, gr, i, antal, zi, s;
integer array identer(1:(if max_antal_grupper>max_antal_i_gruppe then
max_antal_grupper else max_antal_i_gruppe));
procedure skriv_vt_gruppe(zud,omfang);
value omfang;
integer omfang;
zone zud;
begin
integer øg;
write(zud,"nl",1,<:+++ vt_gruppe :>);
if omfang <> 0 then
disable
begin
skriv_coru(zud,abs curr_coruno);
write(zud,"nl",1,<<d>,
<: cs_fil :>,cs_fil,"nl",1,
<: op :>,op,"nl",1,
<: filop :>,filop,"nl",1,
<: funk :>,funk,"nl",1,
<: res :>,res,"nl",1,
<: filref :>,filref,"nl",1,
<: gr :>,gr,"nl",1,
<: i :>,i,"nl",1,
<: antal :>,antal,"nl",1,
<: zi :>,zi,"nl",1,
<: s :>,s,"nl",1,
<::>);
raf:= 0;
system(3,øg,identer);
write(zud,"nl",1,<:identer::>);
skriv_hele(zud,identer.raf,øg*2,2);
end;
end;
stackclaim(if cm_test then 198 else 146);
filop:= fil_opref;
trap(vt_grp_trap);
iaf:= 0;
\f
message procedure vt_gruppe side 2 - 810409/cl;
<*+2*>
<**> disable if testbit47 and overvåget or testbit28 then
<**> skriv_vt_gruppe(out,0);
<*-2*>
vent_op:
waitch(cs_vt_grp,op,gen_optype or vt_optype,-1);
<*+2*>
<**>disable
<**>begin
<**> if testbit41 and overvåget then
<**> begin
<**> skriv_vt_gruppe(out,0);
<**> write(out,<: modtaget operation:>);
<**> skriv_op(out,op);
<**> ud;
<**> end;
<**>end;
<*-2*>
disable
begin
integer opk;
opk:= d.op.opkode extract 12;
funk:= if opk=25 then 1 else
if opk=26 then 2 else
if opk=27 then 3 else
if opk=28 then 4 else
0;
if funk=0 then fejlreaktion(2,opk,<:vt_gruppe:>,0);
end;
<*+4*>
<**> if funk<4 and d.op.data(1) shift (-21) <> 5 then
<**> begin
<**> disable begin
<**> d.op.resultat:= 31;
<**> fejlreaktion(10,d.op.data(1),<:gruppe ident:>,1);
<**> end;
<**> goto returner;
<**> end;
<*-4*>
goto case funk of(definer,slet,vis,oversigt);
\f
message procedure vt_gruppe side 3 - 810505/cl;
definer:
disable
begin
gr:= 0; res:= 0;
for i:= max_antal_grupper step -1 until 1 do
begin
if gruppetabel(i)=0 then gr:= i <*fri plads*> else
if gruppetabel(i)=d.op.data(1) then res:= 34; <*allerede defineret*>
end;
if gr=0 then res:= 32; <*ingen plads*>
end;
if res<>0 then goto slut_definer;
disable
begin <*fri plads fundet*>
antal:= d.op.data(2);
if antal <=0 or max_antal_i_gruppe<antal then
res:= 33 <*fejl i gruppestørrelse*>
else
begin
for i:= 1 step 1 until antal do
begin
s:= læsfil(d.op.data(3),i,zi);
if s<>0 then fejlreaktion(5,s,<:gruppe,def:>,0);
identer(i):= fil(zi).iaf(1);
end;
s:= modif_fil(tf_gruppedef,gr,zi);
if s<>0 then fejlreaktion(7,s,<:gruppe,def:>,0);
tofrom(fil(zi).iaf,identer,antal*2);
for i:= antal+1 step 1 until max_antal_i_gruppe do
fil(zi).iaf(i):= 0;
gruppetabel(gr):= d.op.data(1);
s:= modiffil(tf_gruppeidenter,gr,zi);
if s<>0 then fejlreaktion(7,s,<:gruppe,def:>,0);
fil(zi).iaf(1):= gruppetabel(gr);
res:= 3;
end;
end;
slut_definer:
<*slet fil*>
start_operation(fil_op,curr_coruid,cs_fil,104);
d.filop.data(4):= d.op.data(3);
signalch(cs_slet_fil,filop,vt_optype);
waitch(cs_fil,filop,vt_optype,-1);
if d.filop.data(9)<>0 then fejlreaktion(16,d.filop.data(9),<:gruppe,def:>,0);
d.op.resultat:= res;
goto returner;
\f
message procedure vt_gruppe side 4 - 810409/cl;
slet:
disable
begin
gr:= 0; res:= 0;
for i:= 1 step 1 until max_antal_grupper do
begin
if gruppetabel(i)=d.op.data(1) then gr:= i;
end;
if gr = 0 then res:= 8 <*gruppe ej defineret*>
else
begin
for i:= 1 step 1 until max_antal_gruppeopkald do
if gruppeopkald(i,1)=d.op.data(1) then res:=15; <*gruppe optaget*>
if res = 0 then
begin
gruppetabel(gr):= 0;
s:= modif_fil(tf_gruppeidenter,gr,zi);
if s<>0 then fejlreaktion(7,s,<:gruppe,slet:>,0);
fil(zi).iaf(1):= gruppetabel(gr);
res:= 3;
end;
end;
d.op.resultat:= res;
end;
goto returner;
\f
message procedure vt_gruppe side 5 - 810505/cl;
vis:
disable
begin
res:= 0; gr:= 0; antal:= 0; filref:= 0;
for i:= 1 step 1 until max_antal_grupper do
if gruppetabel(i) = d.op.data(1) then gr:= i;
if gr = 0 then res:= 8
else
begin
s:= læsfil(tf_gruppedef,gr,zi);
if s<>0 then fejlreaktion(5,s,<:gruppe,vis:>,0);
for i:= 1 step 1 until max_antal_i_gruppe do
begin
identer(i):= fil(zi).iaf(i);
if identer(i) <> 0 then antal:= antal +1;
end;
start_operation(filop,curr_coruid,cs_fil,101);
d.filop.data(1):= antal; <*postantal*>
d.filop.data(2):= 1; <*postlængde*>
d.filop.data(3):= (antal-1)//256 + 1; <*segmenter*>
d.filop.data(4):= 2 shift 10; <*spool fil*>
d.filop.data(5):= d.filop.data(6):=
d.filop.data(7):= d.filop.data(8):= 0; <*navn*>
signalch(cs_opret_fil,filop,vt_optype);
end;
end;
if res <> 0 then goto slut_vis;
waitch(cs_fil,filop,vt_optype,-1);
disable
begin
if d.filop.data(9) <> 0 then
fejlreaktion(13,d.filop.data(9),<:gruppe,vis:>,0);
filref:= d.filop.data(4);
for i:= 1 step 1 until antal do
begin
s:= skrivfil(filref,i,zi);
if s <> 0 then fejlreaktion(6,s,<:gruppe,vis:>,0);
fil(zi).iaf(1):= identer(i);
end;
res:= 3;
end;
slut_vis:
d.op.resultat:= res; d.op.data(2):= antal; d.op.data(3):= filref;
goto returner;
\f
message procedure vt_gruppe side 6 - 810508/cl;
oversigt:
disable
begin
res:= 0; antal:= 0; filref:= 0; iaf:= 0;
for i:= 1 step 1 until max_antal_grupper do
begin
if gruppetabel(i) <> 0 then
begin
antal:= antal +1;
identer(antal):= gruppetabel(i);
end;
end;
start_operation(filop,curr_coruid,cs_fil,101);
d.filop.data(1):= antal; <*postantal*>
d.filop.data(2):= 1; <*postlængde*>
d.filop.data(3):= if antal = 0 then 1 else
(antal-1)//256 +1; <*segm.antal*>
d.filop.data(4):= 2 shift 10; <*spool fil*>
d.filop.data(5):= d.filop.data(6):=
d.filop.data(7):= d.filop.data(8):= 0; <*navn*>
signalch(cs_opretfil,filop,vt_optype);
end;
waitch(cs_fil,filop,vt_optype,-1);
disable
begin
if d.filop.data(9) <> 0 then
fejlreaktion(13,d.filop.data(9),<:grupper,over:>,0);
filref:= d.filop.data(4);
for i:= 1 step 1 until antal do
begin
s:= skriv_fil(filref,i,zi);
if s <> 0 then fejlreaktion(6,s,<:gruppe,over:>,0);
fil(zi).iaf(1):= identer(i);
end;
d.op.resultat:= 3; <*ok*>
d.op.data(1):= antal;
d.op.data(2):= filref;
end;
\f
message procedure vt_gruppe side 7 - 810505/cl;
returner:
disable
begin
<*+2*>
<**> if testbit43 and overvåget and (funk=1 or funk=2) then
<**> begin
<**> skriv_vt_gruppe(out,0);
<**> write(out,<: gruppetabel efter ændring:>);
<**> p_gruppetabel(out);
<**> end;
<**> if testbit41 and overvåget then
<**> begin
<**> skriv_vt_gruppe(out,0);
<**> write(out,<: returner operation:>);
<**> skriv_op(out,op);
<**> end;
<*-2*>
signalch(d.op.retur,op,d.op.optype);
end;
goto vent_op;
vt_grp_trap:
disable skriv_vt_gruppe(zbillede,1);
end vt_gruppe;
\f
message procedure vt_spring side 1 - 810506/cl;
procedure vt_spring(cs_spring_retur,spr_opref);
value cs_spring_retur,spr_opref;
integer cs_spring_retur,spr_opref;
begin
integer array field komm_op,spr_op,iaf;
real nu;
integer funk,interval,nr,i,s,id1,id2,res,res_inf,medd_kode,zi;
procedure skriv_vt_spring(zud,omfang);
value omfang;
zone zud;
integer omfang;
begin
write(zud,"nl",1,<:+++ vt_spring :>);
if omfang <> 0 then
begin
skriv_coru(zud,abs curr_coruno);
write(zud,"nl",1,<<d>,
<:cs-spring-retur:>,cs_spring_retur,"nl",1,
<:spr-op :>,spr_op,"nl",1,
<:komm-op :>,komm_op,"nl",1,
<:funk :>,funk,"nl",1,
<:interval :>,interval,"nl",1,
<:nr :>,nr,"nl",1,
<:i :>,i,"nl",1,
<:s :>,s,"nl",1,
<:id1 :>,id1,"nl",1,
<:id2 :>,id2,"nl",1,
<:res :>,res,"nl",1,
<:res-inf :>,res_inf,"nl",1,
<:medd-kode :>,medd_kode,"nl",1,
<:zi :>,zi,"nl",1,
<:nu :>,<<zddddd.dddd>,nu,"nl",1,
<::>);
end;
end;
\f
message procedure vt_spring side 2 - 810506/cl;
procedure vt_operation(aktion,id1,id2,res,res_inf);
value aktion,id1,id2;
integer aktion,id1,id2,res,res_inf;
begin <* aktion: 11=indsæt, 12=udtag, 13=omkod *>
integer array field akt_op;
<* vent på adgang til vogntabel *>
waitch(cs_vt_adgang,akt_op,true,-1);
<* start operation *>
disable
begin
start_operation(akt_op,curr_coruid,cs_spring_retur,aktion);
d.akt_op.data(1):= id1;
d.akt_op.data(2):= id2;
signalch(cs_vt_opd,akt_op,vt_optype);
end;
<* afvent svar *>
waitch(cs_spring_retur,akt_op,vt_optype,-1);
res:= d.akt_op.resultat;
res_inf:= d.akt_op.data(3);
<*+2*>
<**> disable
<**> if testbit45 and overvåget then
<**> begin
<**> real t;
<**> skriv_vt_spring(out,0);
<**> write(out,"nl",1,<<zddddd>,systime(4,d.akt_op.tid,t),<:.:>,t);
<**> skriv_id(out,springtabel(nr,1),0);
<**> write(out,<:.:>,string(extend springtabel(nr,2) shift 24),<:(:>,
<**> <<d>,extend springtabel(nr,3) shift (-12) extract 24,<:)::>,
<**> if aktion=11 then <:indsæt:> else if aktion=12 then <:udtag:> else
<**> if aktion=13 then <:omkod:> else <:***:>,<: - res=:>,
<**> d.akt_op.resultat,"sp",2);
<**> skriv_id(out,d.akt_op.data(1),8);
<**> skriv_id(out,d.akt_op.data(2),8);
<**> skriv_id(out,d.akt_op.data(3),8);
<**> systime(4,springtid(nr),t);
<**> write(out,<: springtid: :>,<<zd.dd>,entier(t/100),"nl",1);
<**> end;
<*-2*>
<* åbn adgang til vogntabel *>
disable signalch(cs_vt_adgang,akt_op,gen_optype or vt_optype);
end vt_operation;
\f
message procedure vt_spring side 2a - 810506/cl;
procedure io_meddelelse(medd_no,bus,linie,springno);
value medd_no,bus,linie,springno;
integer medd_no,bus,linie,springno;
begin
disable start_operation(spr_op,curr_coruid,cs_spring_retur,36);
d.spr_op.data(1):= medd_no;
d.spr_op.data(2):= bus;
d.spr_op.data(3):= linie;
d.spr_op.data(4):= springtabel(springno,1);
d.spr_op.data(5):= springtabel(springno,2);
disable signalch(cs_io,spr_op,io_optype or gen_optype);
waitch(cs_spring_retur,spr_op,io_optype or gen_optype,-1);
end;
procedure returner_op(op,res);
value res;
integer array field op;
integer res;
begin
<*+2*>
<**> disable
<**> if testbit41 and overvåget then
<**> begin
<**> skriv_vt_spring(out,0); write(out,<: returner operation::>);
<**> skriv_op(out,op);
<**> end;
<*-2*>
d.op.resultat:= res;
signalch(d.op.retur,op,d.op.optype);
end;
\f
message procedure vt_spring side 3 - 810603/cl;
iaf:= 0;
spr_op:= spr_opref;
stack_claim((if cm_test then 198 else 146) + 24);
trap(vt_spring_trap);
for i:= 1 step 1 until max_antal_spring do
begin
springtabel(i,1):= springtabel(i,2):= springtabel(i,3):= 0;
springtid(i):= springstart(i):= 0.0;
end;
<*+2*>
<**> disable
<**> if testbit44 and overvåget then
<**> begin
<**> skriv_vt_spring(out,0);
<**> write(out,<: springtabel efter initialisering:>);
<**> p_springtabel(out); ud;
<**> end;
<*-2*>
<*+2*>
<**> disable if testbit47 and overvåget or testbit28 then
<**> skriv_vt_spring(out,0);
<*-2*>
\f
message procedure vt_spring side 4 - 810609/cl;
næste_tid: <* find næste tid *>
disable
begin
interval:= -1; <*vent uendeligt*>
systime(1,0.0,nu);
for i:= 1 step 1 until max_antal_spring do
if springtabel(i,3) < 0 then
interval:= 5
else
if springtid(i) <> 0.0 and
( (springtid(i)-nu) < interval or interval < 0 ) then
interval:= (if springtid(i) <= nu then 0 else
round(springtid(i) -nu));
if interval=0 then interval:= 1;
end;
\f
message procedure vt_spring side 4a - 810525/cl;
<* afvent operation eller timeout *>
waitch(cs_vt_spring,komm_op,vt_optype or gen_optype,interval);
if komm_op <> 0 then goto afkod_operation;
<* timeout *>
systime(1,0.0,nu);
nr:= 1;
næste_sekv:
if nr > max_antal_spring then goto næste_tid;
if springtid(nr) > nu and springtabel(nr,3) > 0 or springstart(nr)=0.0 then
begin
nr:= nr +1;
goto næste_sekv;
end;
disable s:= modif_fil(tf_springdef,nr,zi);
if s <> 0 then fejlreaktion(7,s,<:spring:>,0);
if springtabel(nr,3) < 0 then
begin <* hængende spring *>
if springtid(nr) <= nu then
begin <* spring ikke udført indenfor angivet interval - annuler *>
<* find frit løb *>
disable
begin
id2:= 0;
for i:= 1 step 1 until springtabel(nr,3) extract 12 do
if fil(zi).iaf(2+i) shift (-22) = 1 then
id2:= fil(zi).iaf(1) extract 15 shift 7
+ fil(zi).iaf(2+i) shift (-12) extract 7 +1 shift 22;
end;
<* send meddelelse til io *>
io_meddelelse(5,0,id2,nr);
<* annuler spring*>
for i:= 1,2,3 do springtabel(nr,i):= 0;
springtid(nr):= springstart(nr):= 0.0;
end
else
begin <* forsøg igen *>
\f
message procedure vt_spring side 5 - 810525/cl;
i:= abs(extend springtabel(nr,3) shift (-12) extract 24);
if i = 2 <* første spring ej udført *> then
begin
id1:= fil(zi).iaf(1) extract 15 shift 7
+ fil(zi).iaf(3) shift (-12) extract 7 +1 shift 22;
id2:= id1;
vt_operation(12<*udtag*>,id1,id2,res,res_inf);
end
else
begin
id1:= fil(zi).iaf(1) extract 15 shift 7
+ fil(zi).iaf(2+i-1) shift (-12) extract 7 +1 shift 22;
id2:= id1 shift (-7) shift 7
+ fil(zi).iaf(2+i-2) shift (-12) extract 7;
vt_operation(13<*omkod*>,id1,id2,res,res_inf);
end;
<* check resultat *>
medd_kode:= if res = 3 and i = 2 then 7 else
if res = 3 and i > 2 then 8 else
<* if res = 9 then 1 else
if res =12 then 2 else
if res =14 then 4 else
if res =18 then 3 else *>
0;
if medd_kode > 0 then
io_meddelelse(medd_kode,res_inf,if res=3 or res=12 then
id2 else id1,nr);
if res = 3 then
begin <* spring udført *>
disable s:= modiffil(tf_springdef,nr,zi);
if s<>0 then fejlreaktion(7,s,<:spring:>,0);
springtabel(nr,3):= i shift 12 +springtabel(nr,3) extract 12;
fil(zi).iaf(2+i-1):= 1 shift 22 +fil(zi).iaf(2+i-1) extract 22;
if i > 2 then fil(zi).iaf(2+i-2):=
fil(zi).iaf(2+i-2) extract 22 add (1 shift 23);
end;
end;
end <* hængende spring *>
else
begin
i:= spring_tabel(nr,3) shift (-12);
id1:= fil(zi).iaf(1) extract 15 shift 7
+ fil(zi).iaf(2+i) shift (-12) extract 7 +1 shift 22;
id2:= fil(zi).iaf(2+i-1) shift (-12) extract 7
+ id1 shift (-7) shift 7;
vt_operation(13<*omkod*>,id1,id2,res,res_inf);
\f
message procedure vt_spring side 6 - 820304/cl;
<* check resultat *>
medd_kode:= if res = 3 then 8 else
if res = 9 then 1 else
if res =12 then 2 else
if res =14 then 4 else
if res =18 then 3 else
if res =60 then 9 else 0;
if medd_kode > 0 then
io_meddelelse(medd_kode,res_inf,if res=3 or res=12 then id2 else id1,nr);
<* opdater springtabel *>
disable s:= modiffil(tf_springdef,nr,zi);
if s<>0 then fejlreaktion(7,s,<:spring:>,0);
if fil(zi).iaf(2+i) extract 12 = 0 <*sidste løb*> then
begin
io_meddelelse(if res=3 then 6 else 5,0,
if res=3 then id1 else id2,nr);
for i:= 1,2,3 do springtabel(nr,i):= 0; <*annuleret*>
springtid(nr):= springstart(nr):= 0.0;
end
else
begin
springtid(nr):= springtid(nr) +(fil(zi).iaf(2+i) extract 12)*60.0;
if res = 3 then
begin
fil(zi).iaf(2+i-1):= (1 shift 23) add
(fil(zi).iaf(2+i-1) extract 22);
fil(zi).iaf(2+i) := (1 shift 22) add
(fil(zi).iaf(2+i) extract 22);
springtabel(nr,3):=(i+1) shift 12 add (springtabel(nr,3) extract 12);
end
else
springtabel(nr,3):= (-i-1) shift 12 add (springtabel(nr,3) extract 12);
end;
end;
<*+2*>
<**> disable
<**> if testbit44 and overvåget then
<**> begin
<**> skriv_vt_spring(out,0); write(out,<: springtabel efter ændring:>);
<**> p_springtabel(out); ud;
<**> end;
<*-2*>
nr:= nr +1;
goto næste_sekv;
\f
message procedure vt_spring side 7 - 810506/cl;
afkod_operation:
<*+2*>
<**> disable
<**> if testbit41 and overvåget then
<**> begin
<**> skriv_vt_spring(out,0); write(out,<: modtaget operation:>);
<**> skriv_op(out,komm_op);
<**> end;
<*-2*>
disable
begin integer opk;
opk:= d.komm_op.opkode extract 12;
funk:= if opk = 30 <*sp,d*> then 5 else
if opk = 31 <*sp. *> then 1 else
if opk = 32 <*sp,v*> then 4 else
if opk = 33 <*sp,o*> then 6 else
if opk = 34 <*sp,r*> then 2 else
if opk = 35 <*sp,a*> then 3 else
0;
if funk = 0 then fejlreaktion(2,opk,<:vt_spring:>,0);
if funk <> 6 <*sp,o*> then
begin <* find nr i springtabel *>
nr:= 0;
for i:= 1 step 1 until max_antal_spring do
if springtabel(i,1) = d.komm_op.data(1) and
springtabel(i,2) = d.komm_op.data(2) then nr:= i;
end;
end;
if funk = 6 then goto oversigt;
if funk = 5 then goto definer;
if nr = 0 then
begin
returner_op(komm_op,37<*spring ukendt*>);
goto næste_tid;
end;
goto case funk of(start,indsæt,annuler,vis);
\f
message procedure vt_spring side 8 - 810525/cl;
start:
if springtabel(nr,3) shift (-12) <> 0 then
begin returner_op(komm_op,38); goto næste_tid; end;
disable
begin <* find linie_løb_og_udtag *>
s:= modif_fil(tf_springdef,nr,zi);
if s <> 0 then fejlreaktion(7,s,<:spring,start:>,0);
id1:= fil(zi).iaf(1) extract 15 shift 7
+ fil(zi).iaf(3) shift (-12) extract 7 +1 shift 22;
id2:= 0;
end;
vt_operation(12,id1,id2,res,res_inf);
disable <* check resultat *>
medd_kode:= if res = 3 <*ok*> then 7 else
if res = 9 <*linie/løb ukendt*> then 1 else
if res =14 <*optaget*> then 4 else
if res =18 <*i kø*> then 3 else 0;
returner_op(komm_op,3);
if medd_kode = 0 then goto næste_tid;
<* send spring-meddelelse til io *>
io_meddelelse(medd_kode,res_inf,id1,nr);
<* opdater springtabel *>
disable
begin
s:= modif_fil(tf_springdef,nr,zi);
if s <> 0 then fejlreaktion(7,s,<:spring,start:>,0);
springtabel(nr,3):= (if res = 3 then 2 else (-2)) shift 12
add (springtabel(nr,3) extract 12);
systime(1,0.0,nu);
springstart(nr):= nu;
springtid(nr):= nu +fil(zi).iaf(3) extract 12 *60.0;
if res = 3 then fil(zi).iaf(3):= fil(zi).iaf(3) add (1 shift 22);
end;
<*+2*>
<**> disable
<**> if testbit44 and overvåget then
<**> begin
<**> skriv_vt_spring(out,0); write(out,<: springtabel efter ændring:>);
<**> p_springtabel(out); ud;
<**> end;
<*-2*>
goto næste_tid;
\f
message procedure vt_spring side 9 - 810506/cl;
indsæt:
if springtabel(nr,3) shift (-12) = 0 then
begin <* ikke igangsat *>
returner_op(komm_op,41);
goto næste_tid;
end;
<* find frie linie/løb *>
disable
begin
s:= læs_fil(tf_springdef,nr,zi);
if s <> 0 then fejlreaktion(5,s,<:spring,reserve:>,0);
id2:= 0;
for i:= 1 step 1 until springtabel(nr,3) extract 12 do
if fil(zi).iaf(2+i) shift (-22) = 1 then
id2:= 1 shift 22 +fil(zi).iaf(1) extract 15 shift 7
+fil(zi).iaf(2+i) shift (-12) extract 7;
id1:= d.komm_op.data(3);
end;
if id2<>0 then
vt_operation(11,id1,id2,res,res_inf)
else
res:= 42;
disable <* check resultat *>
medd_kode:= if res = 3 <*ok*> then 8 else
if res =10 <*bus ukendt*> then 0 else
if res =11 <*bus allerede indsat*> then 0 else
if res =12 <*linie/løb allerede besat*> then 2 else
if res =42 <*intet frit linie/løb*> then 5 else 0;
if res = 11 or res = 12 then d.komm_op.data(4):= res_inf;
returner_op(komm_op,res);
if medd_kode = 0 then goto næste_tid;
<* send springmeddelelse til io *>
if res<>42 then io_meddelelse(medd_kode,id1,id2,nr);
io_meddelelse(5,0,0,nr);
\f
message procedure vt_spring side 9a - 810525/cl;
<* annuler springtabel *>
for i:= 1,2,3 do springtabel(nr,i):= 0;
springtid(nr):= springstart(nr):= 0.0;
<*+2*>
<**> disable
<**> if testbit44 and overvåget then
<**> begin
<**> skriv_vt_spring(out,0); write(out,<: springtabel efter ændring:>);
<**> p_springtabel(out); ud;
<**> end;
<*-2*>
goto næste_tid;
\f
message procedure vt_spring side 10 - 810525/cl;
annuler:
disable
begin <* find evt. frit linie/løb *>
s:= læs_fil(tf_springdef,nr,zi);
if s <> 0 then fejlreaktion(5,s,<:spring,annuler:>,0);
id1:= id2:= 0;
for i:= 1 step 1 until springtabel(nr,3) extract 12 do
if fil(zi).iaf(2+i) shift (-22) = 1 then
id2:= fil(zi).iaf(1) extract 15 shift 7
+ fil(zi).iaf(2+i) shift (-12) extract 7 +1 shift 22;
returner_op(komm_op,3);
end;
<* send springmeddelelse til io *>
io_meddelelse(5,id1,id2,nr);
<* annuler springtabel *>
for i:= 1,2,3 do springtabel(nr,i):= 0;
springtid(nr):= springstart(nr):= 0.0;
<*+2*>
<**> disable
<**> if testbit44 and overvåget then
<**> begin
<**> skriv_vt_spring(out,0); write(out,<: springtabel efter ændring:>);
<**> p_springtabel(out); ud;
<**> end;
<*-2*>
goto næste_tid;
definer:
if nr <> 0 then <* allerede defineret *>
begin
res:= 36;
goto slut_definer;
end;
<* find frit nr *>
i:= 0;
for i:= i+1 while i<= max_antal_spring and nr = 0 do
if springtabel(i,1) = 0 then nr:= i;
if nr = 0 then
begin
res:= 32; <* ingen fri plads *>
goto slut_definer;
end;
\f
message procedure vt_spring side 11 - 810525/cl;
disable
begin integer array fdim(1:8),ia(1:32);
<* læs sekvens *>
fdim(4):= d.komm_op.data(3);
s:= hent_fil_dim(fdim);
if s <> 0 then fejlreaktion(8,s,<:spring,def:>,0);
if fdim(1) > 30 then
res:= 35 <* springsekvens for stor *>
else
begin
for i:= 1 step 1 until fdim(1) do
begin
s:= læs_fil(fdim(4),i,zi);
if s <> 0 then fejlreaktion(5,s,<:spring,def:>,0);
ia(i):= fil(zi).iaf(1) shift 12;
if i>1 then ia(i-1):= ia(i-1) + fil(zi).iaf(1) shift (-12);
end;
s:= modif_fil(tf_springdef,nr,zi);
if s <> 0 then fejlreaktion(7,s,<:spring,def:>,0);
fil(zi).iaf(1):= springtabel(nr,1):= d.komm_op.data(1);
fil(zi).iaf(2):= springtabel(nr,2):= d.komm_op.data(2);
iaf:= 4;
tofrom(fil(zi).iaf,ia,60);
iaf:= 0;
springtabel(nr,3):= fdim(1);
springtid(nr):= springstart(nr):= 0.0;
res:= 3;
end;
end;
\f
message procedure vt_spring side 11a - 81-525/cl;
slut_definer:
<* slet fil *>
start_operation(spr_op,curr_coruid,cs_spring_retur,104);
d.spr_op.data(4):= d.komm_op.data(3); <* filref *>
signalch(cs_slet_fil,spr_op,vt_optype);
waitch(cs_spring_retur,spr_op,vt_optype,-1);
if d.spr_op.data(9) <> 0 then
fejlreaktion(16,d.spr_op.data(9),<:spring,def:>,0);
returner_op(komm_op,res);
<*+2*>
<**> disable
<**> if testbit44 and overvåget then
<**> begin
<**> skriv_vt_spring(out,0); write(out,<: springtabel efter ændring:>);
<**> p_springtabel(out); ud;
<**> end;
<*-2*>
goto næste_tid;
\f
message procedure vt_spring side 12 - 810525/cl;
vis:
disable
begin
<* tilknyt fil *>
start_operation(spr_op,curr_coruid,cs_spring_retur,101);
d.spr_op.data(1):= (springtabel(nr,3) extract 12)*2;
d.spr_op.data(2):= 1;
d.spr_op.data(3):= (d.spr_op.data(1) -1)//256 +1;
d.spr_op.data(4):= 2 shift 10; <* spoolfil *>
signalch(cs_opret_fil,spr_op,vt_optype);
end;
<* afvent svar *>
waitch(cs_spring_retur,spr_op,vt_optype,-1);
if d.spr_op.data(9) <> 0 then
fejlreaktion(13,d.spr_op.data(9),<:spring,vis:>,0);
disable
begin integer array ia(1:30);
s:= læs_fil(tf_springdef,nr,zi);
if s <> 0 then fejlreaktion(5,s,<:spring,vis:>,0);
iaf:= 4;
tofrom(ia,fil(zi).iaf,60);
iaf:= 0;
for i:= 1 step 1 until d.spr_op.data(1) do
begin
s:= skriv_fil(d.spr_op.data(4),(i-1)*2+1,zi);
if s <> 0 then fejlreaktion(6,s,<:spring,vis:>,0);
fil(zi).iaf(1):= if ia(i) shift (-22) = 0 then
ia(i) shift (-12) extract 7
else -(ia(i) shift (-12) extract 7);
s:= skriv_fil(d.spr_op.data(4),2*i,zi);
if s <> 0 then fejlreaktion(6,s,<:spring,vis:>,0);
fil(zi).iaf(1):= if i < d.spr_op.data(1) then
(if ia(i+1) shift (-22) <> 0 then -(ia(i) extract 12)
else ia(i) extract 12)
else 0;
end;
d.spr_op.data(1):= d.spr_op.data(1) - 1;
sæt_fil_dim(d.spr_op.data);
d.komm_op.data(3):= d.spr_op.data(1);
d.komm_op.data(4):= d.spr_op.data(4);
raf:= data+8;
d.komm_op.raf(1):= springstart(nr);
returner_op(komm_op,3);
end;
goto næste_tid;
\f
message procedure vt_spring side 13 - 810525/cl;
oversigt:
disable
begin
<* opret fil *>
start_operation(spr_op,curr_coruid,cs_spring_retur,101);
d.spr_op.data(1):= max_antal_spring;
d.spr_op.data(2):= 4;
d.spr_op.data(3):= (max_antal_spring -1)//64 +1;
d.spr_op.data(4):= 2 shift 10; <* spoolfil *>
signalch(cs_opret_fil,spr_op,vt_optype);
end;
<* afvent svar *>
waitch(cs_spring_retur,spr_op,vt_optype,-1);
if d.spr_op.data(9) <> 0 then
fejlreaktion(13,d.spr_op.data(9),<:spring,over:>,0);
disable
begin
nr:= 0;
for i:= 1 step 1 until max_antal_spring do
begin
if springtabel(i,1) <> 0 then
begin
nr:= nr +1;
s:= skriv_fil(d.spr_op.data(4),nr,zi);
if s <> 0 then fejlreaktion(6,s,<:spring,over:>,0);
fil(zi).iaf(1):= springtabel(i,1);
fil(zi).iaf(2):= springtabel(i,2);
fil(zi,2):= springstart(i);
end;
end;
d.spr_op.data(1):= nr;
s:= sæt_fil_dim(d.spr_op.data);
if s <> 0 then fejlreaktion(9,s,<:spring,over:>,0);
d.komm_op.data(1):= nr;
d.komm_op.data(2):= d.spr_op.data(4);
returner_op(komm_op,3);
end;
goto næste_tid;
vt_spring_trap:
disable skriv_vt_spring(zbillede,1);
end vt_spring;
\f
message procedure vt_auto side 1 - 810505/cl;
procedure vt_auto(cs_auto_retur,auto_opref);
value cs_auto_retur,auto_opref;
integer cs_auto_retur,auto_opref;
begin
integer array field op,auto_op,iaf;
integer filref,id1,id2,aktion,postnr,sidste_post,interval,res,
res_inf,i,s,zi,kl,døgnstart;
real t,nu,næste_tid;
boolean optaget;
integer array filnavn(1:4);
procedure skriv_vt_auto(zud,omfang);
value omfang;
zone zud;
integer omfang;
begin
write(zud,"nl",1,<:+++ vt_auto :>);
if omfang<>0 then
begin
skriv_coru(zud,abs curr_coruno);
write(zud,"nl",1,<<d>,
<:cs-auto-retur :>,cs_auto_retur,"nl",1,
<:op :>,op,"nl",1,
<:auto-op :>,auto_op,"nl",1,
<:filref :>,filref,"nl",1,
<:id1 :>,id1,"nl",1,
<:id2 :>,id2,"nl",1,
<:aktion :>,aktion,"nl",1,
<:postnr :>,postnr,"nl",1,
<:sidste-post :>,sidste_post,"nl",1,
<:interval :>,interval,"nl",1,
<:res :>,res,"nl",1,
<:res-inf :>,res_inf,"nl",1,
<:i :>,i,"nl",1,
<:s :>,s,"nl",1,
<:zi :>,zi,"nl",1,
<:kl :>,kl,"nl",1,
<:døgnstart :>,døgnstart,"nl",1,
<:optaget :>,if optaget then <:true:> else <:false:>,"nl",1,
<:t :>,<<zddddd.dddd>,t,"nl",1,
<:nu :>,nu,"nl",1,
<:næste-tid :>,næste_tid,"nl",1,
<::>);
end;
end skriv_vt_auto;
\f
message procedure vt_auto side 2 - 810507/cl;
iaf:= 0;
auto_op:= auto_opref;
filref:= id1:= id2:= aktion:= postnr:= sidste_post:= 0;
optaget:= false;
næste_tid:= 0.0;
stack_claim(if cm_test then 198 else 146);
trap(vt_auto_trap);
<*+2*>
<**> disable if testbit47 and overvåget or testbit28 then
<**> skriv_vt_auto(out,0);
<*-2*>
vent:
systime(1,0.0,nu);
interval:= if filref=0 then (-1) <*uendeligt*> else
if næste_tid > nu then round(næste_tid-nu) else
if optaget then 5 else 0;
if interval=0 then interval:= 1;
<*v*> waitch(cs_vt_auto,op,vt_optype or gen_optype,interval);
if op<>0 then goto filskift;
<* vent på adgang til vogntabel *>
<*v*> waitch(cs_vt_adgang,op,vt_optype,-1);
<* afsend relevant operation til opdatering af vogntabel *>
start_operation(op,curr_coruid,cs_auto_retur,aktion);
d.op.data(1):= id1;
d.op.data(2):= id2;
signalch(cs_vt_opd,op,vt_optype);
<*v*> waitch(cs_auto_retur,op,vt_optype,-1);
res:= d.op.resultat;
id2:= d.op.data(2);
res_inf:= d.op.data(3);
<* åbn for vogntabel *>
signalch(cs_vt_adgang,op,vt_optype or gen_optype);
\f
message procedure vt_auto side 3 - 810507/cl;
<* behandl svar fra opdatering *>
<*+2*>
<**> disable
<**> if testbit45 and overvåget then
<**> begin
<**> integer li,lø,bo;
<**> skriv_vt_auto(out,0);
<**> write(out,"nl",1,<<zddddd>,systime(4,d.op.tid,t),<:.:>,entier t,
<**> <: POSTNR. :>,<<d>,postnr,if aktion=12 then <:: SLET:> else
<**> <:: OMKOD:>,<: - RES=:>,res);
<**> for i:= 1,2 do
<**> begin
<**> li:= d.op.data(i);
<**> lø:= li extract 7; bo:= li shift (-7) extract 5;
<**> if bo<>0 then bo:= bo + 'A' - 1;
<**> li:= li shift (-12) extract 10;
<**> write(out,<< ddd>,li,false add bo,1,"/",1,<<d>,lø);
<**> end;
<**> systime(4,næste_tid,t);
<**> write(out,<< zddd>,d.op.data(3) extract 14,<: - AUTOTID::>,
<**> << zd.dd>,t/10000,"nl",1);
<**> end;
<*-2*>
if res=31 then
fejlreaktion(10,aktion,<:AUTO: SYSTEMFEJL:>,1)
else
if res<>3 then
begin
if -, optaget then
begin
disable start_operation(auto_op,curr_coruid,cs_auto_retur,22);
d.auto_op.data(1):= if res=9 then 1 else if res=12 then 2 else
if res=18 then 3 else if res=60 then 9 else 4;
d.auto_op.data(2):= res_inf;
d.auto_op.data(3):= if res=12 then id2 else id1;
signalch(cs_io,auto_op,io_optype or gen_optype);
waitch(cs_auto_retur,auto_op,io_optype or gen_optype,-1);
end;
if res=14 or res=18 then <* i kø eller optaget *>
begin
optaget:= true;
goto vent;
end;
end;
optaget:= false;
\f
message procedure vt_auto side 4 - 810507/cl;
<* find næste post *>
disable
begin
if postnr=sidste_post then
begin <* døgnskift *>
postnr:= 1;
døgnstart:= systime(4,systid(døgnstart+1,120000),t);
end
else postnr:= postnr+1;
s:= læsfil(filref,postnr,zi);
if s<>0 then fejlreaktion(5,s,<:auto:>,0);
aktion:= fil(zi).iaf(1);
næste_tid:= systid(døgnstart,fil(zi).iaf(2));
id1:= fil(zi).iaf(3);
id2:= fil(zi).iaf(4);
end;
goto vent;
\f
message procedure vt_auto side 5 - 810507/cl;
filskift:
<*+2*>
<**> disable
<**> if testbit41 and overvåget then
<**> begin
<**> skriv_vt_auto(out,0);
<**> write(out,<: modtaget operation::>);
<**> skriv_op(out,op);
<**> end;
<*-2*>
for i:= 1 step 1 until 4 do filnavn(i):= 0;
res:= 46;
if d.op.opkode extract 12 <> 21 then
fejlreaktion(2,d.op.opkode extract 12,<:auto,filskift:>,0);
if filref = 0 then goto knyt;
<* gem filnavn til io-meddelelse *>
disable begin
integer array fdim(1:8);
integer array field navn;
fdim(4):= filref;
hentfildim(fdim);
navn:= 8;
tofrom(filnavn,fdim.navn,8);
end;
<* frivgiv tilknyttet autofil *>
disable start_operation(auto_op,curr_coruid,cs_auto_retur,103);
d.auto_op.data(4):= filref;
signalch(cs_frigiv_fil,auto_op,vt_optype);
<*v*> waitch(cs_auto_retur,auto_op,vt_optype,-1);
if d.auto_op.data(9) <> 0 then
fejlreaktion(15,d.auto_op.data(9),<:auto,filskift:>,0);
filref:= aktion:= id1:= id2:= postnr:= sidste_post:= 0;
optaget:= false;
næste_tid:= 0.0;
res:= 3;
\f
message procedure vt_auto side 6 - 810507/cl;
<* tilknyt evt. ny autofil *>
knyt:
if d.op.data(1)<>0 then
begin
disable startoperation(auto_op,curr_coruid,cs_auto_retur,102);
d.auto_op.data(4):= 30 shift 12; <* contentskey,subno *>
for i:= 1,2,3,4 do d.auto_op.data(4+i):= d.op.data(i);
disable
begin integer pos1,pos2;
pos1:= pos2:= 13;
while læstegn(d.auto_op.data,pos1,i)<>0 do
begin
if 'A'<=i and i<='Å' then i:= i - 'A' + 'a';
skrivtegn(d.auto_op.data,pos2,i);
end;
end;
signalch(cs_tilknyt_fil,auto_op,vt_optype);
<*v*> waitch(cs_auto_retur,auto_op,vt_optype,-1);
s:= d.auto_op.data(9);
if s=0 then res:= 3 <* ok *> else
if s=1 or s=2 then res:= 46 <* ukendt navn *> else
if s=5 or s=7 then res:= 47 <* galt indhold *> else
if s=6 then res:= 48 <* i brug *> else
fejlreaktion(14,2,<:auto,filskift:>,0);
if res<>3 then goto returner;
<* find første post *>
disable
begin
døgnstart:= systime(5,0.0,t);
kl:= round t;
filref:= d.auto_op.data(4);
sidste_post:= d.auto_op.data(1);
postnr:= 0;
for postnr:= postnr+1 while postnr <= sidste_post do
begin
s:= læsfil(filref,postnr,zi);
if s<>0 then fejlreaktion(5,s,<:auto,filskift:>,0);
if fil(zi).iaf(2) > kl then goto post_fundet;
end;
postnr:= 1;
døgnstart:= systime(4,systid(døgnstart+1,120000),t);
\f
message procedure vt_auto side 7 - 810507/cl;
post_fundet:
s:= læsfil(filref,postnr,zi);
if s<>0 then fejlreaktion(5,s,<:auto,filskift:>,0);
aktion:= fil(zi).iaf(1);
næste_tid:= systid(døgnstart,fil(zi).iaf(2));
id1:= fil(zi).iaf(3);
id2:= fil(zi).iaf(4);
res:= 3;
end;
end ny fil;
returner:
d.op.resultat:= res;
<*+2*>
<**> disable
<**> if testbit41 and overvåget then
<**> begin
<**> skriv_vt_auto(out,0);
<**> write(out,<: returner operation::>);
<**> skriv_op(out,op);
<**> end;
<*-2*>
signalch(d.op.retur,op,d.op.optype);
if filnavn(1)<>0 then
begin <* meddelelse til io om annulering *>
disable begin
start_operation(auto_op,curr_coruid,cs_auto_retur,23<*io_gen_medd*>);
i:= 1;
hægtstring(d.auto_op.data,i,<:auto :>);
skriv_text(d.auto_op.data,i,filnavn);
hægtstring(d.auto_op.data,i,<: annuleret:>);
repeat skrivtegn(d.auto_op.data,i,'nul') until (i-1) mod 6 = 0;
signalch(cs_io,auto_op,io_optype or gen_optype);
end;
waitch(cs_auto_retur,auto_op,io_optype or gen_optype,-1);
end;
goto vent;
vt_auto_trap:
disable skriv_vt_auto(zbillede,1);
end vt_auto;
:5: vogntabel: initialisering
\f
message vogntabel initialisering side 1 - 820301;
sidste_bus:= sidste_linie_løb:= 0;
tf_vogntabel:= 1 shift 10 + 2;
tf_gruppedef:= ia(4):= 1 shift 10 +3;
tf_gruppeidenter:= 1 shift 10 +6;
tf_springdef:= 1 shift 10 +7;
hent_fil_dim(ia);
max_antal_i_gruppe:= ia(2);
if ia(1) < max_antal_grupper then
max_antal_grupper:= ia(1);
for i:= 0 step 1 until max_antal_garager do
begin
garagenavn(i):= long( case i+1 of (
<:___:>,<:DSV:>,<:UNI:>,<:CIT:>,<:___:>,<:___:>,<:___:>,<:___:>,<:___:>,<:___:>,
<:___:>,<:TCT:>,<:IRL:>,<:ART:>,<:RYV:>,<:ØRV:>,<:ISL:>,<:VAL:>,<:HUS:>,<:___:>,
<:___:>,<:HHL:>,<:DHB:>,<:BIB:>,<:KOK:>,<:___:>,<:___:>,<:___:>,<:___:>,<:___:>,
<:___:>,<:GLX:>,<:DBB:>,<:HCS:>,<:THR:>,<:BAB:>,<:___:>,<:___:>,<:___:>,<:___:>,
<:___:>,<:KJ:> ,<:THO:>,<:HVR:>,<:STT:>,<:___:>,<:___:>,<:___:>,<:___:>,<:___:>,
<:___:>,<:HI:> ,<:HIB:>,<:___:>,<:___:>,<:___:>,<:___:>,<:___:>,<:___:>,<:___:>,
<:___:>,<:HG:> ,<:___:>,<:___:>,<:___:>,<:___:>,<:___:>,<:___:>,<:___:>,<:___:>,
<:___:>,<:BA:> ,<:___:>,<:___:>,<:___:>,<:___:>,<:___:>,<:___:>,<:___:>,<:___:>,
<:___:>,<:RO:> ,<:ROT:>,<:ALJ:>,<:TÅB:>,<:ROM:>,<:KWK:>,<:___:>,<:___:>,<:___:>,
<:___:>,<:FS:> ,<:CHS:>,<:___:>,<:___:>,<:___:>,<:___:>,<:___:>,<:___:>,<:___:>,
<::>));
garageomr(i):= case i+1 of (
0,3,3,3,0,0,0,0,0,0,
0,3,3,3,3,3,3,3,3,0,
0,6,6,6,6,0,0,0,0,0,
0,7,7,7,7,11,0,0,0,0,
0,8,8,8,8,0,0,0,0,0,
0,9,9,0,0,0,0,0,0,0,
0,10,0,0,0,0,0,0,0,0,
0,11,0,0,0,0,0,0,0,0,
0,4,4,4,4,4,4,0,0,0,
0,5,5,0,0,0,0,0,0,0,
0);
end;
<* initialisering af interne vogntabeller *>
begin
long array field laf1,laf2;
integer array fdim(1:8);
zone z(128,1,stderror);
integer busnr,i,j,zi,s,pant,ll_nr,b_nr,res,tegn,g_nr,o_nr;
long omr,garageid;
integer field ll, bn;
boolean binær, test24;
ll:= 2; bn:= 4;
<* nulstil tabellerne *>
laf1:= -2;
laf2:= 2;
bustabel1.laf2(0):=
bustabel.laf2(0):= bustilstand.laf2(0):= linie_løb_tabel.laf2(0):=
bus_indeks.laf2(0):= linie_løb_indeks.laf2(0):= extend 0;
tofrom(bustabel.laf2,bustabel.laf1,(max_antal_busser+1)*2-4);
tofrom(bustabel1.laf2,bustabel1.laf1,(max_antal_busser+1)*2-4);
tofrom(linie_løb_tabel.laf2,linie_løb_tabel.laf1,(max_antal_linie_løb+1)*2-4);
tofrom(busindeks.laf2,busindeks.laf1,max_antal_linie_løb-4);
tofrom(linie_løb_indeks.laf2,linie_løb_indeks.laf1,max_antal_busser-4);
tofrom(bustilstand.laf2,bustilstand.laf1,max_antal_busser-4);
\f
message vogntabel initialisering side 1a - 810505/cl;
<* initialisering af intern busnummertabel *>
open(z,4,<:busnumre:>,0);
busnr:= -1;
read(z,busnr);
while busnr > 0 do
begin
if busnr < bustabel(sidste_bus) extract 14 or busnr >= 1 shift 14 then
fejlreaktion(10,busnr,<:fejl i busnrfil:>,0);
sidste_bus:= sidste_bus+1;
if sidste_bus > max_antal_busser then
fejlreaktion(10,busnr,<:for mange busser i busnrfil:>,0);
repeatchar(z); readchar(z,tegn);
garageid:= extend 0; binær:= false; omr:= extend 0;
if tegn='!' then
begin
binær:= true;
readchar(z,tegn);
end;
if tegn='/' then <*garageid*>
begin
readchar(z,tegn);
while ('A'<= tegn and tegn <='Å') do
begin
garageid:= garageid shift 8 + tegn;
readchar(z,tegn);
end;
end;
g_nr:= 0;
if garageid<>0 then
begin
while garageid shift (-40) extract 8 = 0 do
garageid:= garageid shift 8;
i:= 1;
while i<=max_antal_garager and g_nr=0 do
begin
if garageid=garagenavn(i) then g_nr:= i;
i:= i+1;
end;
if g_nr=0 and garageid<>0 then
fejlreaktion(10,busnr,<:ukendt garageidentifikation for bus:>,1);
end;
if tegn=';' then
begin
readchar(z,tegn);
while ('A'<=tegn and tegn<='Å') do
begin
omr:= omr shift 8 + tegn;
readchar(z,tegn);
end;
end;
o_nr:= 0;
if omr<>0 then
begin
while omr shift (-40) extract 8 = 0 do
omr:= omr shift 8;
i:= 1;
while i<=max_antal_områder and o_nr=0 do
begin
if omr=område_navn(i) then o_nr:= i;
i:= i+1;
end;
if o_nr=0 then
fejlreaktion(10,busnr,<:ukendt område for bus:>,1);
end;
if o_nr=0 then o_nr:= 3;
if g_nr=0 then
begin
i:= 1;
while i<=max_antal_garager and g_nr=0 do
begin
if områdenavn(o_nr) = garagenavn(i) then g_nr:= i;
i:= i+1;
end;
end;
bustabel (sidste_bus):= g_nr shift 14 + busnr;
bustabel1(sidste_bus):= (binær extract 1) shift 23 + o_nr;
busnr:= -1;
read(z,busnr);
end;
close(z,true);
\f
message vogntabel initialisering side 2 - 820301/cl;
<* initialisering af intern linie/løbs-tabel og bus-indekstabel *>
test24:= testbit24;
testbit24:= false;
i:= 1;
s:= læsfil(tf_vogntabel,i,zi);
if s<>0 then fejlreaktion(5,s,<:vogntabelinit:>,0);
while fil(zi).bn<>0 do
begin
if fil(zi).ll <> 0 then
begin <* indsæt linie/løb *>
res:= binærsøg(sidste_linie_løb,linie_løb_tabel(j) -
fil(zi).ll,j);
if res < 0 then j:= j+1;
if res = 0 then fejlreaktion(10,fil(zi).bn,
<:dobbeltregistrering i vogntabel:>,1)
else
begin
o_nr:= fil(zi).bn shift (-14) extract 8;
b_nr:= søg_omr_bus(fil(zi).bn extract 14,ll_nr,g_nr,o_nr,s,tegn);
if b_nr<0 then fejlreaktion(10,fil(zi).bn extract 14,
<:ukendt bus i vogntabel:>,1)
else
begin
if sidste_linie_løb >= max_antal_linie_løb then
fejlreaktion(10,fil(zi).bn extract 14,
<:for mange linie/løb i vogntabel:>,0);
for ll_nr:= sidste_linie_løb step (-1) until j do
begin
linie_løb_tabel(ll_nr+1):= linie_løb_tabel(ll_nr);
bus_indeks(ll_nr+1):= bus_indeks(ll_nr);
end;
linie_løb_tabel(j):= fil(zi).ll;
bus_indeks(j):= false add b_nr;
sidste_linie_løb:= sidste_linie_løb + 1;
end;
end;
end;
i:= i+1;
s:= læsfil(tf_vogntabel,i,zi);
if s<>0 then fejlreaktion(5,s,<:vogntabelinit:>,0);
end;
\f
message vogntabel initialisering side 3 - 810428/cl;
<* initialisering af intern linie/løb-indekstabel *>
for ll_nr:= 1 step 1 until sidste_linie_løb do
linie_løb_indeks(bus_indeks(ll_nr) extract 12):= false add ll_nr;
<* gem ny vogntabel i tabelfil *>
for i:= 1 step 1 until sidste_bus do
begin
s:= skriv_fil(tf_vogntabel,i,zi);
if s<>0 then fejlreaktion(6,s,<:vogntabelinit:>,0);
fil(zi).bn:= bustabel(i) extract 14 add
(bustabel1(i) extract 8 shift 14);
fil(zi).ll:= linie_løb_tabel(linie_løb_indeks(i) extract 12);
end;
fdim(4):= tf_vogntabel;
hent_fil_dim(fdim);
pant:= fdim(3) * (256//fdim(2));
for i:= sidste_bus+1 step 1 until pant do
begin
s:= skriv_fil(tf_vogntabel,i,zi);
if s<>0 then fejlreaktion(6,s,<:vogntabelinit:>,0);
fil(zi).ll:= fil(zi).bn:= 0;
end;
<* initialisering/nulstilling af gruppetabeller *>
for i:= 1 step 1 until max_antal_grupper do
begin
s:= læs_fil(tf_gruppeidenter,i,zi);
if s <> 0 then fejlreaktion(5,s,<:gruppetabelinit:>,0);
gruppetabel(i):= fil(zi).ll;
end;
for i:= 1 step 1 until max_antal_gruppeopkald do
gruppeopkald(i,1):= gruppeopkald(i,2):= 0;
testbit24:= test24;
end;
<*+2*>
<**> if testbit40 then p_vogntabel(out);
<**> if testbit43 then p_gruppetabel(out);
<*-2*>
\f
message vogntabel initialisering side 4 - 810520/cl;
cs_vt:= nextsemch;
<*+3*> skriv_new_sem(out,3,cs_vt,<:cs-vt:>);
<*-3*>
cs_vt_adgang:= nextsemch;
<*+3*> skriv_new_sem(out,3,cs_vt_adgang,<:cs-vt-adgang:>);
<*-3*>
cs_vt_opd:= nextsemch;
<*+3*> skriv_new_sem(out,3,cs_vt_opd,<:cs-vt-opd:>);
<*-3*>
cs_vt_rap:= nextsemch;
<*+3*> skriv_new_sem(out,3,cs_vt_rap,<:cs-vt-rap:>);
<*-3*>
cs_vt_tilst:= nextsemch;
<*+3*> skriv_new_sem(out,3,cs_vt_tilst,<:cs-vt-tilst:>);
<*-3*>
cs_vt_auto:= nextsemch;
<*+3*> skriv_new_sem(out,3,cs_vt_auto,<:cs-vt-auto:>);
<*-3*>
cs_vt_grp:= nextsemch;
<*+3*> skriv_new_sem(out,3,cs_vt_grp,<:cs-vt-grp:>);
<*-3*>
cs_vt_spring:= nextsemch;
<*+3*> skriv_new_sem(out,3,cs_vt_spring,<:cs-vt-spring:>);
<*-3*>
vt_op:= nextop(vt_op_længde);
signalch(cs_vt_adgang,vt_op,gen_optype or vt_optype);
\f
message vogntabel initialisering side 5 - 81-520/cl;
i:= nextcoru(500, <*ident*>
10, <*prioitet*>
true <*testmaske*>);
j:= new_activity( i,
0,
h_vogntabel);
<*+3*> skriv_newactivity(out,i,j);
<*-3*>
i:= nextcoru(501, <*ident*>
10, <*prioritet*>
true <*testmaske*>);
iaf:= nextop(filop_længde);
j:= new_activity(i,
0,
vt_opdater,iaf);
<*+3*> skriv_newactivity(out,i,j);
<*-3*>
i:= nextcoru(502, <*ident*>
10, <*prioritet*>
true <*testmaske*>);
k:= nextsemch;
<*+3*> skriv_new_sem(out,3,k,<:cs-fil(vt-tilst):>);
<*-3*>
iaf:= nextop(fil_op_længde);
j:= newactivity(i,
0,
vt_tilstand,
k,
iaf);
<*+3*> skriv_newactivity(out,i,j);
<*-3*>
\f
message vogntabel initialisering side 6 - 810520/cl;
i:= nextcoru(503, <*ident*>
10, <*prioritet*>
true <*testmaske*>);
k:= nextsemch;
<*+3*> skriv_new_sem(out,3,k,<:cs-fil(vt-rapport):>);
<*-3*>
iaf:= nextop(fil_op_længde);
j:= newactivity(i,
0,
vt_rapport,
k,
iaf);
<*+3*> skriv_newactivity(out,i,j);
<*-3*>
i:= nextcoru(504, <*ident*>
10, <*prioritet*>
true <*testmaske*>);
k:= nextsemch;
<*+3*> skriv_new_sem(out,3,k,<:cs-fil(vt-gruppe):>);
<*-3*>
iaf:= nextop(fil_op_længde);
j:= new_activity(i,
0,
vt_gruppe,
k,
iaf);
<*+3*> skriv_newactivity(out,i,j);
<*-3*>
\f
message vogntabel initialisering side 7 - 810520/cl;
i:= nextcoru(505, <*ident*>
10, <*prioritet*>
true <*testmaske*>);
k:= nextsemch;
<*+3*> skriv_new_sem(out,3,k,<:cs-spring-retur:>);
<*-3*>
iaf:= nextop(fil_op_længde);
j:= newactivity(i,
0,
vt_spring,
k,
iaf);
<*+3*> skriv_newactivity(out,i,j);
<*-3*>
i:= nextcoru(506, <*ident*>
10,
true <*testmaske*>);
k:= nextsemch;
<*+3*> skriv_new_sem(out,3,k,<:cs-auto-retur:>);
<*-3*>
iaf:= nextop(if fil_op_længde>(data+20) then fil_op_længde else (data+20));
j:= newactivity(i,
0,
vt_auto,
k,
iaf);
<*+3*> skriv_newactivity(out,i,j);
<*-3*>
<*+2*>
<**> if testbit42 then skriv_vt_variable(out);
<*-2*>
:6: vogntabel: trap
\f
message vogntabel trapaktion side 1 - 810520/cl;
skriv_vt_variable(zbillede);
p_vogntabel(zbillede);
p_gruppetabel(zbillede);
p_springtabel(zbillede);
▶EOF◀