|
|
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: 63744 (0xf900)
Types: TextFile
Names: »htattention «
└─⟦cde9d517b⟧ Bits:30007477 RC8000 Backup tape fra HT's bus-radio system
└─⟦6a563b143⟧
└─⟦this⟧ »htattention «
attention.
attention venter på attention_message fra operatør_skærme og
io_skrivemaskine.
message fra operatør_skærme, der ikke er sat i drift (inkluderede)
afvises med result=4 'disconnected'
message fra andre processer afvises med result=2 'rejected'
message fra operatørskærme i drift og fra io_skrivemaskinen
besvares med result=1 'normal' og der hentes en operation fra
'cs_att_pulje' som sendes til den relevante hovedmodul_semafor,
der vidersender operationen til den relevante kommando_semafor.
efter endt brug skal operationen returneres til cs_att_pulje
v.hj.a. procedure afslut_kommando(operatør_nr,operation);
hver operatørskærm, garageterminal eller io_skrivemaskinen
kan kun have en attention operation under behandling ad gangen,
d.v.s. attention fra en terminal, der er "optaget", er uden virkning.
:1: attention: parameter erklæringer
message attention parametererklæringer side 1 - 810318/hko;
integer
att_op_længde,
terminal_beskr_længde;
integer field
terminal_tilstand,
terminal_suppl;
:2: attention: parameter initialisering
\f
message attention parameterinitialisering side 1 - 810318/hko;
att_op_længde:= 40;
terminal_beskr_længde:=6;
terminal_tilstand:= 2;
terminal_suppl:=4;
:3: attention: claiming
\f
message attention_claiming side 1 - 810318/hko;
maxcoru:=maxcoru+1;
max_op:=max_op +1
+max_antal_operatører
+max_antal_garageterminaler;
max_nettoop:=maxnettoop+(data+att_op_længde)
*(1+max_antal_operatører
+max_antal_garageterminaler);
max_procext:=max_procext+1;
max_sem:= max_sem+1;
max_semch:=maxsemch+1;
:4: attention: erklæringer
\f
message attention_erklæringer side 1 - 850820/cl;
integer
tf_kommandotabel,
cs_att_pulje,
bs_fortsæt_adgang,
att_proc_ref;
long
att_flag,
att_signal;
integer array
terminal_tab(1:terminal_beskr_længde//2*(1<*io*>+8<*operatør*>+8<*garage*>)),
fortsæt(1:32);
\f
message procedure afslut_kommando side 1 - 810507/hko;
procedure afslut_kommando(op_ref);
integer array field op_ref;
begin integer nr,i,sem;
i:= d.op_ref.kilde;
nr:=case i//100 of (0,i mod 100,8+i mod 100);
sætbit_l(att_flag,nr,0);
d.op_ref.optype:=gen_optype;
if sæt_bit_l(att_signal,nr,0)=1 then
begin
sem:=case i//100 of (cs_io_komm,cs_operatør(i mod 100),
cs_garage(i mod 100));
afslut_operation(op_ref,0);
start_operation(op_ref,i,cs_att_pulje,0);
signal_ch(sem,op_ref,gen_optype);
end
else
afslut_operation(op_ref,cs_att_pulje);
end;
\f
message procedure læs_store side 1 - 880919/cl;
integer procedure læs_store(z,c);
zone z;
integer c;
begin
læs_store:= readchar(z,c);
if 'a' <= c and c <= 'å' then c:= c - 'a' + 'A';
end;
\f
message procedure param side 1 - 810226/cl;
integer procedure param(txt,pos,spec,tabel_id,type,værdi,sep);
value tabel_id;
integer pos, tabel_id, type, sep;
integer array txt, spec, værdi;
<*************************************>
<* *>
<* CLAUS LARSEN: 15.07.77 *>
<* *>
<*************************************>
<* param syntax-analyserer en parameterliste, og *>
<* bestemmer næste parameter og den separator der *>
<* afslutter parameteren *>
begin
integer array klasse(0:127), aktuel_param(1:4), fdim(1:8);
real array indgang(1:2);
integer i, j, tegn, tegn_pos, tal, hashnøgle,
zone_nr, top, max_segm, start_segm, lpos;
boolean minus, separator;
lpos := pos;
type:=-1;
for i:=1 step 1 until 4 do værdi(i):=0;
\f
message procedure param side 2 - 810428/cl,hko;
<* grænsecheck for pos *>
begin
integer nedre, øvre;
nedre := system(3,øvre,txt);
nedre := nedre * 3 - 2;
øvre := øvre * 3;
if lpos < (nedre - 1) or øvre < lpos then
begin
sep:= -1;
param:= 5;
goto slut;
end;
<* er parameterlisten slut *>
lpos:= lpos+1;
læs_tegn(txt,lpos,tegn);
if tegn = 'em' or tegn = 'nl' or tegn = 'nul' then
begin
lpos := lpos - 2;
sep := tegn;
param := 5;
goto slut;
end else lpos:= lpos-1;
end;
\f
message procedure param side 3 - 810428/cl;
<* initialisering *>
for i := 1 step 1 until 4 do
aktuel_param(i) := 0;
minus := separator := false;
<* initialiser klassetabel *>
for i := 65 step 1 until 93,
97 step 1 until 125 do klasse(i) := 1;
for i := 48 step 1 until 57 do klasse(i) := 2;
for i := 0 step 1 until 47, 58 step 1 until 64,
94, 95, 96, 126, 127 do klasse(i) := 4;
<* sæt specialtegn *>
i := 1;
læs_tegn(spec,i,tegn);
while tegn <> 0 do
begin
if klasse(tegn) = 4 and tegn <> 'sp' and tegn <> 'nl' then
klasse(tegn) := 3;
læs_tegn(spec,i,tegn);
end;
\f
message procedure param side 4 - 810226/cl;
<* læs første tegn i ny parameter og bestem typen *>
læs_tegn(txt,lpos,tegn);
case klasse(tegn) of
begin
<* case 1 - bogstav *>
begin
type := 0;
param := 0;
tegn_pos := 1;
hashnøgle := 0;
<* læs parameter *>
while tegn_pos < 12 and klasse(tegn) <> 4 do
begin
hashnøgle := hashnøgle + tegn;
skriv_tegn(aktuel_param,tegn_pos,tegn);
læs_tegn(txt,lpos,tegn);
end;
<* find separator *>
while klasse(tegn) <> 4 do læs_tegn(txt,lpos,tegn);
sep := tegn;
\f
message procedure param side 5 - 810226/cl;
<* tabelopslag *>
if tabel_id <> 0 then
begin
<* hent max_segm *>
fdim(4) := tabel_id;
j := hent_fil_dim(fdim);
if j > 0 then
begin
param := 4;
for i := 1 step 1 until 4 do
værdi(i) := aktuel_param(i);
goto slut;
end;
max_segm := fdim(3);
<* forbered opslag *>
start_segm := (hashnøgle mod max_segm) + 1;
indgang(1) := 0.0 shift 48 add aktuel_param(1)
shift 24 add aktuel_param(2);
indgang(2) := 0.0 shift 48 add aktuel_param(3)
shift 24 add aktuel_param(4);
hashnøgle := start_segm;
\f
message procedure param side 6 - 810226/cl;
<* søg navn *>
repeat
<* læs segment *>
læs_fil(tabel_id,hashnøgle,zone_nr);
<* beregn sidste element *>
top := fil(zone_nr,1) extract 24;
top := (top - 1) * 4 + 2;
<* søg *>
for i := 2 step 4 until top do
if fil(zone_nr,i) = indgang(1) and
fil(zone_nr,i+1) = indgang(2) then
begin
<* fundet *>
værdi(1) := fil(zone_nr,i+2) shift (-24)
extract 24;
værdi(2) := fil(zone_nr,i+2) extract 24;
værdi(3) := fil(zone_nr,i+3) shift (-24)
extract 24;
værdi(4) := fil(zone_nr,i+3) extract 24;
goto fundet;
end;
if top = 122 then <*overløb *>
hashnøgle := (hashnøgle mod max_segm) + 1;
until top < 122 or hashnøgle = start_segm;
<* navn findes ikke *>
param := 2;
for j := 1 step 1 until 4 do
værdi(j) := aktuel_param(j);
fundet: ;
end <*tabel_id <> 0 *>
else
for i := 1 step 1 until 4 do
værdi(i) := aktuel_param(i);
end <* case 1 *>;
\f
message procedure param side 7 - 810310/cl,hko;
<* case 2 - ciffer *>
cif: begin
type:=tal := 0;
while klasse(tegn) = 2 do
begin
type:=type+1;
tal := tal * 10 + (tegn - 48);
læs_tegn(txt,lpos,tegn);
end;
if minus then tal := -tal;
værdi(1) := tal;
sep := tegn;
param := 0;
end <* case 2 *>;
\f
message procedure param side 8 - 810428/cl;
<* case 3 - specialtegn *>
spc: begin
if tegn = '-' then
begin
læs_tegn(txt,lpos,tegn);
if klasse(tegn) = 2 then
begin
minus := true;
goto cif;
end
else
begin
tegn := '-';
lpos := lpos - 1;
end;
end;
<* syntaxfejl *>
param := if separator then 1 else 3;
sep := tegn;
end <* case 3 *>;
<* case 4 - separator *>
begin
separator := true;
goto spc;
end <* case 4 *>;
end <* case *>;
lpos := lpos - 1;
slut:
pos := lpos;
end;
\f
message procedure læs_param_sæt side 1 - 830310/cl;
integer procedure læs_param_sæt(tekst,pos,ant,parm,term,res);
integer array tekst, parm;
integer pos,ant, term,res;
<* proceduren læser et sammenhørende sæt parametre
afsluttet med (sp),(nl),(;),(,) eller (nul)
læs_param_sæt returstatus eller 'typen' af det læste parametersæt
(retur,int)
type ant parm indeholder:
<0: x (ingenting) 'læs_param_sæt= nr på fejlkvit.'
0: 0 (ingenting) 'rest kommando er tom'
1: 1 (tekst) 'indtil 11 tegn'
2: 1 (pos.tal)
3: 1 (neg.tal)
4: 1 (pos.tal<1000)(bogstav) 'linienummer'
5: 1 G(pos.tal<100) 'gruppe_ident'
6: 2 (linie)/(løb) 'vogn_ident'
7: 3 (bus)/(linie)/(løb)
8: 3 (linie).(indeks):(løb)
9: 2 (linie).(indeks)
10: 2 (pos.tal).(pos.tal)
11: 2-3 G(pos.tal<100):(vogn) '(vogn)::=(bus)!(linie)/(løb)'
12: 3 D.(dato).(tid)
tekst indeholder teksten hvori parametersættet
(kald,int.arr.) skal søges.
pos
(kald/retur,int.) position efter hvilken søgningen starter, og
ved retur positionen for afsluttende tegn.
(ikke ændret ved fejl)
ant hvis kaldeværdien er >0 skal parametersættet
(kald/retur,int) indeholde det angivne antal enkeltparametre,
i modsat fald returneres med fejltype -26
(skilletegn) eller -25 (parameter mangler).
ellers læses op til 3 enkeltparametre. retur-
værdien afhænger af det læste parametersæts
type, se ovenfor under læs_param_sæt.
\f
message procedure læs_param_sæt side 2 - 810428/hko;
parm skal omfatte elementerne 1 til 4.
(retur,int.arr.) ved returstatus<=0 indeholder alle elemen-
terne værdien 0.
type (element,indhold)
1: 1-4,teksten
2-3: 1, talværdien
4: 1, tal shift 5 +tegnværdi (A=1,B=2,--,Å=29)
5: 1, talværdi (uden G)
6: 1, (som'4') shift 7 + løb
7: 1, bus
2, linie/løb som '6'
8: 1, tal shift 5 eller som '4'
2, tekst (1-3 bogstaver)
3, løb
9: 1 og 2, som '8'
10: 1, talværdi
2, talværdi
11: 1, som '5'
2, vogn (bus eller linie/løb)
12: 1, dato
2, tid
term iso-tegnværdien for tegnet der afslutter
(retur,int) parameter_sættet.
res som læs_param_sæt.
(retur,int)
*>
\f
message procedure læs_param_sæt side 3 - 810310/hko;
begin
integer max_ant;
max_ant:= 3;
begin
integer
i,j,k, <* hjælpe variable *>
nr, <* nummer på parameter i sættet *>
apos, <* aktuel tegnposition *>
cifre, <* parametertype (param: 0=tekst, >1=tal) *>
sep; <* afsluttende skilletegn ved param *>
integer array field
iaf; <* hjælpe variabel *>
integer array
par(1:4*max_ant), <* 4 elementer for hver aktuel parameter *>
s, <* 1 element med separator for hver parameter *>
t(1:max_ant), <* 1 element med typen for hver parameter *>
værdi(1:4), <* værdi af aktuel parameter jvf. param *>
spec(1:1); <* specialtegn i navne jvf. param *>
<* de interne typer af enkeltparametre er
type parameter
1: 1-3 tegn tekst (1 ord)
2: 4-6 tegn (2 ord)
3: 7-9 tegn (3 ord)
4:10-11 tegn (4 ord)
5: positivt heltal
6: negativt heltal
7: positivt heltal<1000 efterfulgt af stort bogstav
8: G efterfulgt af positivt heltal<100
*>
\f
message procedure læs_param_sæt side 4 - 810408/hko;
nr:= 0;
res:= -1;
spec(1):= 0; <* ingen specialtegn *>
apos:= pos;
for i:= 1 step 1 until 4 do parm(i):= 0;
for i:= 1 step 1 until max_ant do
begin
s(i):= t(i):= 0;
for j:= 1 step 1 until 4 do par((i-1)*4+j):= 0;
end;
repeat
<* skip foranstillede sp-tegn *>
for i:= param(tekst,apos,spec,0<*intet tabelopslag*>,cifre,værdi,sep)
while i=1 and sep='sp' do;
<*+2*>
begin
if testbit25 and testbit26 then
disable begin
write(out,"nl",1,<:param (apos,cifre,sep):>,<< -dddd>,
i,apos,cifre,sep);
laf:=0;
if cifre<>0 then
write(out,<: værdi(1-4)::>,
<< -dddd>,værdi(1),værdi(2),værdi(3),værdi(4))
else write(out,<: værdi::>,værdi.laf);
ud;
end;
end;
<*-2*>
;
if i<>0 then <* ikke ok *>
begin
if i=1 and (sep=',' or sep=';') then <* slut_tegn*>
begin
apos:= apos -1;
res:= 0;
end
else if i=1 then res:=-26 <* skilletegn *>
else <* i=5 *> res:= -25 <* parameter mangler *>
end
else <* i=0 *>
begin
if sep=',' or sep=';' then apos:=apos-1;
iaf:= nr*8;
nr:= nr +1;
\f
message procedure læs_param_sæt side 5 - 810520/hko/cl;
if cifre=0 <* navne_parameter *> then
begin
if værdi(2)=0
and læstegn(værdi,1,i)='G'
and læstegn(værdi,2,j)>'0' and j<='9'
and (læstegn(værdi,3,k)=0 or (k>='0' and k<='9'))
then
begin <* gruppenavn, repræsenteres som tal *>
t(nr):= 8;
j:= j -'0';
par.iaf(1):= if k=0 then j else (j*10+(k-'0'));
s(nr):= sep;
end
else
begin <* generel tekst *>
i:= 0;
for i:= i +1 while i<=4 do
begin
if værdi(i)<>0 then
begin
t(nr):= i;
par.iaf(i):= værdi(i);
end
else i:= 4;
end;
s(nr):= sep;
end <* generel tekst *>
end <* navne_parameter *>
else
begin <* talparameter *>
i:= if værdi(1)<0 then 6 <* neg.tal *>
else if værdi(1)>0 and værdi(1)<1000
and sep>='A' and sep<='Å' then 7
else 5 <* positivt tal *>;
t(nr):= i;
par.iaf(1):= if i<>7 then værdi(1)
else værdi(1) shift 5 +(sep+1-'A');
par.iaf(2):= cifre;
apos:= apos+1;
s(nr):= if i=7 then læstegn(tekst,apos,sep) else sep;
apos:= apos-1;
end;
end;<* i=0 *>
until (ant>0 and nr=ant)
or nr=max_ant
or res<> -1
or sep='sp' or sep=';' or sep='em'
or sep=',' or sep='nl' or sep='nul';
\f
message procedure læs_param_sæt side 6 - 810508/hko;
if ant>nr then res:= -25 <*parameter mangler*>
else
if nr=0 or t(1)=0 then
begin <* ingen parameter før skilletegn *>
if res=-25 then res:= 0;
end
else if sep<>'sp' and sep<>'nl' and sep <> 'em'
and sep<>';' and sep<>',' then
begin <* ulovligt afsluttende skilletegn *>
res:= -26;
end
else
begin <* en eller flere lovligt afsluttede parametre *>
if t(1)<5 and nr=1 then
<* 1 navne_parameter *>
begin
res:= 1;
tofrom(parm,par,8);
end
else if <*t(1)<9 and *> nr=1 then
<* 1 parameter af anden type *>
begin <*tal,linie eller gruppe *>
res:= t(1) -3;
parm(1):= par(1);
end
else if t(1)=5 <* pos.tal *> or t(1)=7 <*linie*> then
<* mere end 1 parameter, hvoraf 1. er pos.tal eller linienr *>
begin
i:= par(1); <* lovlige parametre er alle repræsenteret i et ord *>
j:= par(5); <* internt *>
k:= par(9); <* *>
if nr=2 then
<* 2 parametre i sættet *>
begin
res:= if (s(1)='/' or s(1)='.') and t(2)=5 <*pos.tal*> then 6
else if s(1)='.' and t(2)=1 then 9
else if s(1)='-' and t(1)=5 and t(2)=5 then 10
else if s(1)<>'/' and s(1)<>'.'
and s(1)<>'-' then -26 <* skilletegn *>
else -27;<* parametertype*>
\f
message procedure læs_param_sæt side 7 - 810501/hko;
<* mere end 1 parameter, hvoraf 1. er pos.tal eller linienr *>
<* 2 parametre i sættet *>
if res=6 then
begin
if (i<1 or i>999) and t(1)=5 then
res:= -5 <* ulovligt linienr *>
else if (j<1 or j>99) then
res:= -6 <* ulovligt løbsnr *>
else
begin
if t(1)=5 then i:= i shift 5;
parm(1):= i shift 7 +j;
end;
end <* res=6 *>
else if res=9 then
begin
if t(1)=5 and (i<1 or 999<i) then
res:= -5 <*ulovligt linienr*>
else
begin
if t(1)=5 then i:=i shift 5;
parm(1):= i;
parm(2):= j;
end;
end <* res=9 *>
else if res=10 then
begin
begin
parm(1):= i;
parm(2):= j;
end;
end; <* res=10 *>
end <* nr=2 *>
else
if nr=3 then
<* 3 paramtre i sættet *>
begin
res:= if (s(1)='/' or s(1)='.') and
(s(2)='/' or s(2)='.') then 7
else if s(1)='.' and s(2)=':' then 8
else -26; <* skilletegn *>
\f
message procedure læs_param_sæt side 8 - 810501/hko;
<* mere end 1 parameter, hvoraf 1. er pos.tal eller linienr *>
<* 3 parametre i sættet *>
if res=7 then
begin
if t(1)<>5 or (t(2)<>5 and t(2)<>7)
or t(3)<>5 then
res:= -27 <* parametertype *>
else
if i<1 or i>9999 then res:= -7 <* ulovligt busnr *>
else if t(2)=5 and (j<1 or j>999) then res:=-5 <* linie *>
else if k<1 or k>99 then res:= -6 <* løb *>
else
begin <* ok *>
parm(1):= i;
if t(2)=5 then j:= j shift 5;
parm(2):= j shift 7 +k;
end;
end
else if res=8 then
begin
if t(2)<>1 or t(3)<>5 then res:= -27
else if t(1)=5 and (i<1 or i>999) then res:= -5
else if k<1 or k>99 then res:= -6
else
begin
if t(1)=5 then i:= i shift 5;
parm(1):= i;
parm(2):= j;
parm(3):= k;
end;
end;
end <* nr=3 *>
else res:=-24; <* syntaks *>
\f
message procedure læs_param_sæt side 9 - 810428/hko;
end <* mere end 1 parameter,hvoraf 1. er pos.tal eller linienr *>
else if t(1)=8 <* gruppe_id *> then
begin
<* mere end 1 parameter , hvoraf den første
er en gruppe_identifikation ved navn.
lovlige parametre er alle internt repræsenteret i et ord *>
i:=par(1);
j:=par(5);
k:=par(9);
if nr=2 then
<* 2 parametre *>
begin
res:=if s(1)=':' and t(2)=5 then 11
else if s(1)<>':' then -26 <* skilletegn *>
else -27; <*param.type *>
if res=11 then
begin
if j<1 or j>9999 then res:=-7 <* ulovligt busnr *>
else
begin
parm(1):=i;
parm(2):=j;
end;
end;
\f
message procedure læs_param_sæt side 10 - 810428/hko;
<* mere end 1 parameter, hvoraf 1. er en gruppeidentifikation ved navn *>
end <*nr=2*>
else if nr=3 then
<* 3 parametre *>
begin
res:=if s(1)=':' and s(2)='/' then 11
else -26; <* skilletegn *>
if res=11 then
begin
if (t(2)<>5 and t(2)<>7) or t(3)<>5 then res:=-27 <*param.type*>
else
begin
if t(2)=5 and (j<1 or j>999) then res:=-5 <* linie *>
else
begin
parm(1):=i;
if t(2)=5 then j:=j shift 5;
parm(2):= 1 shift 22 +j shift 7 +k;
end;
end;
end;
end <* nr=3 *>
else res:=-24; <* syntaks *>
\f
message procedure læs_param_sæt side 11 - 810501/hko;
end <* t(1)=8 *>
else if t(1)=1 and par(1)= 'D' shift 16 then
begin
<* mere end 1 parameter i sættet og 1. parameter er et 'D'.
lovlige parametre er alle internt repræsenteret i et ord. *>
i:=par(1);
j:=par(5);
k:=par(9);
if nr=3 then
begin
res:=if s(1)='.' and s(2)='.' then 12
else -26; <* skilletegn *>
if res=12 then
begin
if t(2)<>5 or t(3)<>5 then res:=-27 <* param. type *>
else
begin
integer år,md,dg,tt,mm,ss;
real dato,tid;
år:=j//10000;
md:=(j//100) mod 100;
dg:=j mod 100;
cifre:= par(10);
tt:=if cifre>4 then k//10000 else if cifre>2 then k//100
else k;
mm:=if cifre>4 then (k//100) mod 100
else if cifre>2 then k mod 100 else 0;
ss:=if cifre>4 then k mod 100 else 0;
\f
message procedure læs_param_sæt side 12 - 810501/hko;
dato:=systime(5,0.0,tid);
if j=0 then dg:=round dato mod 100;
if år=0 and md=0 then md:=(round dato//100) mod 100;
if år=0 then år:=round dato//10000;
if år>99 or md<1 or md>12 or tt>23 or mm>59 or ss>59 then
res:=-24 <* syntaks *>
else if dg<1 or dg > (case md of (
31,(if år mod 4=0 then 29 else 28),31, 30,31,30,
31,31,30, 31,30,31)) then res:=-24
else
begin
parm(1):=år*10000+md*100+dg;
parm(2):=tt*10000+mm*100+ss;
end;
end;
end; <* res=12 *>
end <* nr=3 *>
else res:=-24; <*syntaks*>
end <* t(1)=1 and par(1)='D' shift 16 *>
else res:=-27;<*parametertype*>
end; <* en eller flere parametre *>
læs_param_sæt:= res;
term:= sep;
if res>= 0 then pos:= apos;
end;
end læs_param_sæt;
\f
message procedure læs_kommando side 1 - 810428/hko;
integer procedure læs_kommando(z,kilde,op_ref,pos,indeks,sep,slut_tegn);
value kilde;
zone z;
integer kilde, pos,indeks,sep,slut_tegn;
integer array field op_ref;
<* proceduren indlæser er kommmando fra en terminal (telex,
skærm eller skrivemaskine). ved indlæsning fra skærm eller
skrivemaskine inviteres først ved udskrivning af '>'-tegn.
for terminalers vedkommendeslettes linie 23 og 24 og 'cursor' positioneres til
23'ende linie inden invitation.
*>
\f
message procedure læs_kommando side 2 - 810428/hko;
begin
integer
a_pos,
a_res,res,
i,j,k;
boolean
skip;
<*V*>setposition(z,0,0);
case kilde//100 of
begin
begin <* io *>
write(z,"nl",1,">",1);
end;
begin <* operatør *>
cursor(z,24,1);
write(z,"esc" add 128,1,<:ÆK:>);
cursor(z,23,1);
write(z,"esc" add 128,1,<:ÆK:>);
outchar(z,'>');
end;
begin <* garageterminal *> ;
outchar(z,'nl');
end
end;
<*V*>setposition(z,0,0);
\f
message procedure læs_kommando side 3 - 810921/hko,cl;
res:=0;
skip:= false;
<*V*>
k:=læs_store(z,i);
apos:= 1;
while k<=6 <*klasse=bogstav*> do
begin
if a_pos<3 then skriv_tegn(d.op_ref.data,apos,i);
<*V*> k:= læs_store(z,i);
end;
skip:= skip or i='?' or (a_pos=1 and (i=',' or i=';'));
if i=',' and a_pos>1 then
begin
skrivtegn(d.op_ref.data,a_pos,i);
repeat
<*V*> k:= læs_store(z,i);
if a_pos=4 and k=6 then skriv_tegn(d.op_ref.data,a_pos,i);
until k>=7;
end;
pos:=a_pos;
while k<8 do
begin
if a_pos< (att_op_længde//2*3-2) then
skriv_tegn(d.op_ref.data,a_pos,i);
skip:= skip or i='?';
<*V*> k:= læs_store(z,i);
pos:=pos+1;
end;
skip:= skip or i='?' or i='esc';
slut_tegn:= i;
skrivtegn(d.op_ref.data,apos,'em');
afslut_text(d.op_ref.data,apos);
\f
message procedure læs_kommando side 4 - 820301/hko/cl;
disable
begin
integer
i1,
nr,
partype,
cifre;
integer array
spec(1:1),
værdi(1:4);
<*+2*>
if testbit25 and overvåget then
disable begin
real array field raf;
write(out,"nl",1,<:kommando læst::>);
laf:=data;
write(out,d.op_ref.laf,<:<'<'>sluttegn<'>'>=:>,<<d>,sluttegn,
<: skip=:>,if skip then <:true:> else <:false:>);
ud;
end;
<*-2*>
for i:=1 step 1 until 32 do ia(i):=0;
if skip then
begin
res:=53; <*annulleret*>
pos:= -1;
goto slut_læskommando;
end;
\f
message procedure læs_kommando side 5 - 850820/cl;
i:= kilde//100; <* hovedmodul *>
k:= kilde mod 100; <* løbenr *>
<* if pos>79 then linieoverløb; *>
pos:=a_pos:=0;
spec(1):= ',' shift 16;
<*+4*>
if k<1 or k>(case i of (1,max_antal_operatører,
max_antal_garageterminaler)) then
begin
fejlreaktion(3<*programfejl*>,kilde,<:ukendt kilde til kommando:>,1);
res:=31;
end
else
<*-4*>
if i>0 and i<4 then <* io, operatør eller garageterminal *>
begin
<* læs operationskode *>
j:=param(d.op_ref.data,apos,spec,tf_kommandotabel,cifre,værdi,sep);
res:= if j=1 and sep='.' and i=2<*operatør*> then -1 <* skærmopdatering *>
else if cifre>0 or j=1 or j=3 or j=5 then 24 <* syntaks *>
else if j=2 then 4 <*ukendt kommando*>
else if j=4 then 31 <*systemfejl: ukendt tabelfil*>
else if sep<>'sp' and sep<>','
and sep<>'nl' and sep<>';'
and sep<>'nul' and sep<>'em' then 26
<*skilletegn*>
else if logand(extend 0 add værdi(4)<*kommandomaske*>,
extend 1 shift (case i of (0,k,8+k)))=0 then 4
<*ukendt kommando*>
else 1;
\f
message procedure læs_kommando side 5a- 810409/hko;
<*+2*>if testbit25 and overvåget then
begin
write(out,"nl",0,<:funk opslag: param,apos,cifre,sep,res::>,
<< -dddd>,j,apos,cifre,sep,res,
<: værdi(1-4)::>,værdi(1),værdi(2),værdi(3),værdi(4),
"nl",0);
if j<>0 then skriv_op(out,op_ref);
ud;
end;
<*-2*>
if res=31 then fejlreaktion(18<*tabelfil*>,j,
<:=res, filnr 1025, læskommando:>,0);
if res=1 then <* operationskode ok *>
begin
if sep<>'sp' then apos:=apos-1;
d.op_ref.opkode:=værdi(1);
indeks:=værdi(2);
partype:= værdi(3);
nr:= 0;
pos:= apos;
\f
message procedure læs_kommando side 6 - 810409/hko;
while res=1 do
begin
læs_param_sæt(d.op_ref.data,apos,0<*indtil 3 enkeltparametre*>,
værdi,sep,a_res);
nr:= nr +1;
i1:= værdi(1);
<*+2*> if testbit25 and overvåget then
begin
write(out,"nl",1,<:param sæt: apos,sep,ares::>,<< -dddddd>,
apos,sep,ares,<: værdi(1-4)::>,
værdi(1),værdi(2),værdi(3),værdi(4),
"nl",0);
ud;
end;
<*-2*>
case par_type of
begin
<*1: (<ingenting>!<busnr> (<omr>)!<linienr>/<løbnr> (<omr>)) *>
begin
if nr=1 then
begin
if a_res=0 then res:=2 <*godkendt*>
else if a_res=2 and (i1<1 or i1>9999)
then res:=7 <*busnr ulovligt*>
else if a_res=2 or a_res=6 then
begin
ia(1):= if a_res=2 then i1
else 1 shift 22 +i1;
end
else res:= 27; <*parametertype*>
if res<4 then pos:= apos;
end <*nr=1*>
else
if nr=2 then
begin
if ares=0 then res:= 2 <*godkendt*>
else if ares=1 then
begin
ia(2):= find_område(i1);
if ia(2)=0 then res:= 17; <* kanal-nr ukendt *>
end
else res:= 27; <* syntaks, parametertype *>
end
else
if ares=0 then res:= 2<*godkendt*> else res:= 24 <* syntaks *>;
end;
\f
message procedure læs_kommando side 7 - 810226/hko;
<*2: (<busnr> (<område>)!<linie>/<løbnr>) *>
begin
if nr=1 then
begin
if a_res=0 then res:=25 <*parameter mangler*>
else if a_res=2 and (i1<1 or i1>9999)
then res:=7 <*busnr ulovligt*>
else if a_res=2 or a_res=6 then
begin
ia(1):=if a_res=2 then i1
else 1 shift 22 +i1;
end
else res:= 27; <*parametertype*>
if res<4 then pos:=a_pos;
end
else
if nr=2 then
begin
if ares=0 then res:= 2 <*godkendt*> else
if ares=1 and ia(1) shift (-21) = 0 then
begin
ia(2):= findområde(i1);
if ia(2)=0 then res:= 56; <*område ukendt*>
end
else res:= 27;
if res<4 then pos:= apos;
end
else
if ares=0 then res:= 2 else res:= 24<*syntaks*>;
end;
\f
message procedure læs_kommando side 8 - 810223/hko;
<*3: (<linie>!G<nr>) *>
begin
if nr=1 then
begin
if a_res=0 then res:=25 <*parameter mangler*>
else if a_res=2 and (i1<1 or i1>999) then res:=5
<*linienr ulovligt*>
else if a_res=2 or a_res=4 or a_res=5 then
begin
ia(1):=
if a_res=2 then 4 shift 21 +i1 shift 5
else if a_res=4 then 4 shift 21 +i1
else <* a_res=5 *> 5 shift 21 +i1;
end
else res:=27; <* parametertype *>
if res<4 then pos:= a_pos;
end
else
res:= if nr=2 and a_res<>0 then 24<*syntaks*>
else 2;<*godkendt*>
end;
<*4: <ingenting> *>
begin
res:= if a_res<>0 then 24<*syntaks*>
else 2;<*godkendt*>
end;
\f
message procedure læs_kommando side 9 - 810226/hko;
<*5: (<kanalnr>) *>
begin
long field lf;
if nr=1 then
begin
if a_res=0 then res:= 25
else if a_res<>1 then res:=27<*parametertype*>
else
begin
j:= 0; lf:= 4;
for i:= 1 step 1 until max_antal_kanaler do
if kanal_navn(i)=værdi.lf then j:= i;
if j<>0 then
begin
ia(1):= 3 shift 22 + j;
res:= 2;
end
else
res:= 17; <* kanal ukendt *>
end;
if res<4 then pos:= a_pos;
end
else
res:=if nr=2 and a_res<>0 then 24<*syntaks*>
else 2;<*godkendt*>
end;
\f
message procedure læs_kommando side 10 - 810415/hko;
<*6: <busnr>/<linie>/<løb> (<område>) *>
begin
if nr=1 then
begin
if a_res=0 then res:=25<*parameter mangler*>
else if a_res=7 then
begin
ia(1):= i1;
ia(2):= 1 shift 22 + værdi(2);
end
else res:=27;<*parametertype*>
if res<4 then pos:= apos;
end
else
if nr=2 then
begin
if ares=0 then res:= 2 <*godkendt*> else
if ares=1 then
begin
ia(3):= findområde(i1);
if ia(3)=0 then res:= 56; <* område ukendt *>
end
else res:= 27; <*parametertype*>
if res<4 then pos:= apos;
end
else
if ares=0 then res:= 2 else res:= 24;
end;
\f
message procedure læs_kommando side 11 - 810512/hko/cl;
<* att_op_længde//2-2 *>
<*7: <linienr>.<indeks>:<løbnr> (<interval>.<løb>) *>
<* 1 *>
begin
if nr=1 then
begin
if a_res=0 then res:=25 <*parameter mangler*>
else if a_res=8 then
begin
ia(1):= 4 shift 21 + i1;
ia(2):= værdi(2);
ia(3):= værdi(3);
indeks:= 3;
end
else res:=27;<*parametertype*>
end
else if nr<=att_op_længde//2-2 then
begin
if a_res=0 and (sep=',' or nr>2) then res:=2<*godkendt*>
else if a_res=0 then res:=25 <* parameter mangler *>
else if a_res=10 then
begin
if i1>0 and i1<100 and værdi(2)>0 and værdi(2)<100 then
begin
ia(nr+2):= i1 shift 12 + værdi(2);
indeks:= nr +2;
end
else if i1<1 or i1>99 then res:=44 <*intervalstr. ulovlig*>
else res:=6; <*løb-nr ulovligt*>
end
else res:=27;<*parametertype*>
end
else
res:= if a_res=0 then 2 else 24;<* syntaks *>
if res<4 then pos:=a_pos;
end;
\f
message procedure læs_kommando side 12 - 810306/hko;
<*8: (<operatør>!<radiokanal>!<garageterminal>) *>
begin
if nr=1 then
begin
if a_res=0 then res:=25 <* parameter mangler *>
else if a_res=2 then
begin
j:=d.op_ref.opkode;
ia(1):=i1;
k:=(j+1)//2;
if k<1 or k=3 or k>4 then
fejlreaktion(3<*programfejl*>,j,<:opkode, partype=8:>,1)
else
begin
if k=4 then k:=3;
if i1<1 or i1> (case k of
(max_antal_operatører,max_antal_radiokanaler,
max_antal_garageterminaler))
then res:=case k of (28,29,17);
end;
end
else res:=27; <*parametertype*>
end
else <* nr>1 *>
begin
res:=if a_res=0 then 2 <* godkendt *>
else 24;<* syntaks *>
end;
if res<4 then pos:=a_pos;
end; <* partype 8 *>
\f
message procedure læs_kommando side 13 - 810306/hko;
<* att_op_længde//2 *>
<*9: <operatør>((+!-)<linienr>) *>
<* 1 *>
begin
if nr=1 then
begin
if a_res=0 then res:=25 <* parameter mangler *>
else if a_res=2 then
begin
ia(1):=i1;
if i1<1 or i1>max_antal_operatører then res:=28;
end
else res:=27; <* parametertype *>
end
else if nr<=att_op_længde//2 then
begin <* nr>1 *>
if a_res=0 then res:=(if nr>2 then 2 else 25)
else if a_res=2 or a_res=3 then
begin
ia(nr):=i1; indeks:= nr;
if i1=0 or abs(i1)>999 then res:=5;
end
else res:=27; <* parametertype *>
if res<4 then pos:=a_pos;
end
else
res:=if a_res<>0 then 24 <* syntaks (for mange parametre) *>
else 2;
end; <* partype 9 *>
\f
message procedure læs_kommando side 14 - 810428/hko;
<* 2 *>
<*10: (bus) *>
<* 1 *>
begin
if a_res=0 and nr=1 then res:=25 <* parameter mangler *>
else if a_res<>0 and nr>2 then res:=24 <* syntaks (for mange) *>
else if a_res=0 then res:=2 <* godkendt *>
else if a_res<>2 then res:=27 <* parametertype *>
else if i1<1 or i1>9999 then res:=7 <*ulovligt busnr *>
else
ia(nr):=i1;
end;
<* 5 *>
<*11: (<linie>) *>
<* 1 *>
begin
if a_res=0 and nr=1 then res:=25
else if a_res<>0 and nr>5 then res:=24
else if a_res=0 then res:=2
else if a_res<>2 and a_res<>4 then res:=27
else if a_res=2 and (i1<1 or i1>999) then res:=5 <* ulovl.linie *>
else
ia(nr):=
(if a_res=4 then i1 else i1 shift 5) + 4 shift 21;
end;
\f
message procedure læs_kommando side 15 - 810306/hko;
<*12: (<ingenting>!<navn>) *>
begin
if nr=1 then
begin
if a_res=0 then res:=2 <*godkendt*>
else if a_res=1 then
tofrom(ia,værdi,8)
else res:=27; <* parametertype *>
end
else
res:=if a_res<>0 then 24 <* syntaks (for mange) *>
else 2;
end; <* partype 12 *>
\f
message procedure læs_kommando side 16 - 810512/hko/cl;
<* 15 *>
<*13: G<grp.nr>:(<bus>!<linie>/<løb>) (<bus>!<linie>/<løb>) *>
<* 1 *>
begin
if nr=1 then
begin
if a_res=0 then res:=25 <* parameter mangler *>
else
if a_res=11 then
begin
ia(1):= 5 shift 21 + i1;
ia(2):=værdi(2);
indeks:= 2;
end
else res:=27; <* parametertype *>
end
else if nr<= att_op_længde//2-1 then
begin
if a_res=0 and(sep=',' or nr>2)then res:=2 <* godkendt *>
else if a_res=0 then res:=25 <* parameter mangler *>
else if ares=2 and (i1<1 or i1>9999) then
res:= 7 <*busnr ulovligt*>
else if a_res=2 or a_res=6 then
begin
ia(nr+1):=i1+ (if a_res=6 then 1 shift 22 else 0);
indeks:= nr+1;
end
else res:=27; <* parametertype *>
end
else
res:=if a_res=0 then 2 <*godkendt *>
else 24;<* syntaks *>
if res<4 then pos:=a_pos;
end; <* partype 13 *>
\f
message procedure læs_kommando side 17 - 810311/hko;
<*14: <linie>.<indeks> *>
begin
if nr=1 then
begin
if a_res=0 then res:=25 <* parameter mangler *>
else if a_res=9 then
begin
ia(1):= 1 shift 23 +i1;
ia(2):= værdi(2);
end
else res:=27; <* parametertype *>
end
else <* nr>1 *>
res:= if a_res=0 then 2 <* godkendt *>
else 24;<* syntaks *>
end; <* partype 14 *>
\f
message procedure læs_kommando side 18 - 810313/hko;
<*15: <linie>.<indeks> <bus> *>
begin
if nr=1 then
begin
if a_res=0 then res:= 25 <* parameter mangler *>
else if a_res=9 then
begin
ia(1):= 1 shift 23 +i1;
ia(2):= værdi(2);
end
else res:=27; <* parametertype *>
end
else if nr=2 then
begin
if a_res=0 then res:=25
else if a_res=2 then
begin
if i1<1 or i1>9999 then res:=7 <* ulovligt busnr *>
else ia(3):= i1;
end
else res:=27; <*parametertype *>
end
else
res:=if a_res=0 then 2 <* godkendt *>
else 24;<* syntaks *>
if res<4 then pos:=a_pos;
end; <* partype 15 *>
\f
message procedure læs_kommando side 19 - 810311/hko;
<*16: (<ingenting>!D.<dato>.<klokkeslet> *>
begin
if nr=1 then
begin
if a_res=0 then res:=2 <* godkendt *>
else if a_res=12 then
begin
raf:=0;
ia.raf(1):= systid(i1,værdi(2));
end
else res:=27; <* parametertype *>
end
else
res:= if a_res=0 then 2 <* godkendt *>
else 24;<* syntaks *>
if res<4 then pos:=a_pos;
end; <* partype 16 *>
\f
message procedure læs_kommando side 20 - 810511/hko;
<*17: G<grp.nr> *>
begin
if nr=1 then
begin
if a_res=0 then res:=25 <*parameter mangler *>
else if a_res=5 then
begin
ia(1):= 5 shift 21 +i1;
end
else res:=27; <* parametertype *>
end
else
res:= if a_res=0 then 2 <* godkendt *>
else 24;<* syntaks *>
end; <* partype 17 *>
<* att_op_længde//2 *>
<*18: (<heltal>) *>
<* 1 *>
begin
if nr=1 and a_res=0 then res:= 25 <*parameter mangler*>
else
if nr<=att_op_længde//2 then
begin
if a_res=2 or a_res=3 <* pos/neg heltal *> then
begin
ia(nr):= i1; indeks:= nr;
end
else if a_res=0 then res:= 2
else res:= 27; <*parametertype*>
end
else
res:= if a_res=0 then 2 else 24;<*syntaks (for mange)*>
end;
\f
message procedure læs_kommando side 21 - 820302/cl;
<*19: <linie>/<løb> <linie>/<løb> *>
begin
if nr<3 and a_res=0 then res:= 25 <*parameter mangler*>
else if nr<3 and a_res<>6 then res:= 27 <*parametertype*>
else if nr<3 then
begin
ia(nr):=i1 + 1 shift 22;
end
else
res:= if a_res=0 then 2 <*godkendt*>
else 24;<*syntaks (for mange)*>
if res<4 then pos:= a_pos;
end; <* partype 19 *>
<* 8 *>
<*20: <operatør> (<garagenavn>) *>
<* 1 *>
begin
if nr<3 and a_res=0 then res:= 25 <*parameter mangler*>
else if nr=1 then
begin
if a_res=2 then
begin
ia(1):= i1;
if i1<0 or max_antal_operatører<i1 then res:= 28;
end
else res:= 27; <*parametertype*>
end
else
begin integer t1,t2,t3; boolean b1,b2,b3;
if a_res=0 then res:= (if nr>2 then 2 else 25)
else if nr>9 then res:= 24
else if a_res=1 then
begin
ia(nr):= find_garage_nr(i1);
indeks:= nr;
if ia(nr)=0 then res:= 55; <*garagenavn ukendt*>
end
else res:= 27;
end;
if res<4 then pos:=a_pos;
end; <* partype 20 *>
\f
message procedure læs_kommando side 22 - 851001/cl;
<* 2 *>
<*21: ( <linie> ) (<område>) *>
<* 1 *>
begin
if nr=1 and a_res=0 then res:= 25 <*parameter mangler*>
else if a_res=0 and ia(3)=-2 then res:= 25
else if a_res<>0 and nr>2 then res:= 24 <*syntaks (for mange)*>
else if a_res=0 then res:= 2 <*godkendt*>
else if a_res=2 and (i1<1 or i1>999) then res:= 5 <*ulovligt*>
else if (a_res=2 or a_res=4) and nr<=2 then
begin
if ia(3)<>0 then res:= 27 else
ia(nr):= (4 shift 21) + (if a_res=2 then i1 shift 5 else i1);
end
else
if ares=1 then
begin
if nr=1 then
begin
ia(1):= (4 shift 21) + (1 shift 5);
ia(2):= (4 shift 21) + (999 shift 5);
end;
if ia(3)=-2 then
begin
if i1=long<:ALL:> shift (-24) extract 24 then
ia(3):= -1
else
begin
ia(3):= findområde(i1);
if ia(3)=0 then res:= 56 else
ia(3):= 14 shift 20 + ia(3);
end;
end
else
if ia(3) = 0 then
begin
if i1 = long<:OMR:> shift (-24) extract (24) then
ia(3):= -2
else
ia(3):= findgaragenr(i1);
if ia(3)=0 then res:= 55;
end
else res:= 46;
end
else res:= 27; <*parametertype*>
if res<4 then pos:= apos;
end;
<* 22: (<busnr> (<område) ! <linie>/<løb> (<område>) ) *>
begin
if nr=1 then
begin
if ares=0 then res:= 25 <*parameter mangler*>
else if ares=2 and (i1<1 or i1>9999)
then res:= 7 <* busnr ulovligt *>
else if ares=2 or ares=6 then
begin
ia(1):= if ares=2 then i1 else 1 shift 22 + i1;
end
else res:= 27 <* parametertype *>
end
else
if nr=2 then
begin
if ares=0 then res:= 2 <* godkendt *>
else if ares=1 then
begin
ia(2):= findområde(i1);
if ia(2)=0 then res:= 17 <*kanal ukendt*>
end
else
res:= 27; <* parametertype *>
end
else if ares=0 then res:= 2 <*godkendt*>
else res:= 24; <*syntaks*>
if res < 4 then pos:= apos;
end;
<* 23: ( <linie> (<område>) ! G<nr> (<område>) ) *>
begin
if nr=1 then
begin
if ares=0 then res:= 25 else
if ares=2 and (i1<1 or i1>999) then res:= 5 else
if ares=2 or ares=4 or ares=5 then
begin
ia(1):=
if ares=2 then 4 shift 21 + i1 shift 5 else
if ares=4 then 4 shift 21 + i1 else
5 shift 21 + i1;
end
else res:= 27;
if res < 4 then pos:= apos;
end
else
if nr=2 then
begin
if ares=0 then res:= 2 else
if ares=1 then
begin
ia(2):= findområde(i1);
if ia(2)=0 then res:= 17;
end
else res:= 27;
end
else
if ares=0 then res:= 2 else res:= 24;
end;
<* 24: ( <ingenting> ! <område> ! * ) *>
begin
if nr=1 then
begin
if ares=0 then res:= 2 else
if ares=1 then
begin
if i1=long<:ALL:> shift (-24) extract 24 then
ia(1):= (-1) shift (-3) shift 3
else
begin
k:= findområde(i1);
if k=0 then res:= 17 else
ia(1):= 14 shift 20 + k;
end;
end
else res:= 27;
end
else
if ares=0 then res:= 2 else res:= 24;
if res < 4 then pos:= apos;
end;
<* 25: <område> *>
begin
if nr=1 then
begin
if ares=0 then res:= 25 else
if ares=1 then
begin
if i1 = '*' shift 16 then ia(1):= -1 else
ia(1):= findområde(i1);
if ia(1)=0 then res:= 17;
end
else res:= 27;
end
else
if ares=0 then res:= 2 else res:= 24;
if res < 4 then pos:= apos;
end;
<* 26: <busnr> *>
begin
if nr=1 then
begin
if ares=0 then res:= 25 else
if ares=2 and (i1<1 or 9999<i1) then res:= 24 else
if ares<>2 then res:= 27 else ia(1):= i1;
end
else
if ares=0 then res:= 2 else res:= 24;
end;
<* 8 *>
<* 27: <operatørnr> (<område>) *>
<* 1 *>
begin
if nr < 3 and a_res=0 then res:= 25 <*parameter mangler*>
else if nr=1 then
begin
if a_res=2 then
begin
ia(1):= i1;
if i1 < 0 or max_antal_operatører < i1 then res:= 28;
end
else res:= 27; <*parametertype*>
end
else
begin
if a_res=0 then res:= (if nr > 2 then 2 else 25)
else if nr > 9 then res:= 24
else if a_res=1 then
begin
ia(nr):= find_område(i1);
indeks:= nr;
if ia(nr)=0 then res:= 56;
end
else res:= 27;
end;
if res < 4 then pos:= a_pos;
end <* partype 27 *>;
<* 28: (<ingenting>!<kanalnr>) *>
begin
long field lf;
if nr=1 then
begin
if ares=0 then res:= 2 else
if ares=1 then
begin
j:= 0; lf:= 4;
for i:= 1 step 1 until max_antal_kanaler do
if kanal_navn(i)=værdi.lf then j:= i;
if j<>0 then
begin
ia(1):= 3 shift 22 + j;
res:= 2;
end
else
res:= 17; <*kanal ukendt*>
end
else
res:= 27; <*parametertype*>
if res < 4 then pos:= apos;
end
else
res:= if nr=2 and ares<>0 then 24 <*syntaks*> else 2 <*ok*>;
end;
<*+4*> begin
fejlreaktion(4<*systemfejl*>,partype,
<:parametertype fejl i kommandofil:>,1);
res:=31;
end
<*-4*>
end;<*case partype*>
end;<* while læs_param_sæt *>
end; <* operationskode ok *>
end
else
begin
fejlreaktion(3<*programfejl*>,kilde,<:kilde:>,1);
end;
if a_res<0 then res:= -a_res;
slut_læskommando:
læs_kommando:=d.op_ref.resultat:= res;
end;<* disable-blok*>
end læs_kommando;
\f
message procedure skriv_kvittering side 1 - 820301/hko/cl;
procedure skriv_kvittering(z,ref,pos,res);
value ref,pos,res;
zone z;
integer ref,pos,res;
begin
integer array field op;
integer pos1,tegn;
op:=ref;
if res<1 or res>3 then write(z,<:*** :>);
write(z,case res+1 of (
<* 0*><:ubehandlet:>,
<* 1*><:ok:>,
<* 2*><:godkendt:>,
<* 3*><:udført:>,
<* 4*><:kommando ukendt:>,
<* 5*><:linie-nr ulovligt:>,
<* 6*><:løb-nr ulovligt:>,
<* 7*><:bus-nr ulovligt:>,
<* 8*><:gruppe ukendt:>,
<* 9*><:linie/løb ukendt:>,
<*10*><:bus-nr ukendt:>,
<*11*><:bus allerede indsat på :>,
<*12*><:linie/løb allerede besat af :>,
<*13*><:bus ikke indsat:>,
<*14*><:bus optaget:>,
<*15*><:gruppe optaget:>,
<*16*><:skærm optaget:>,
<*17*><:kanal ukendt:>,
<*18*><:bus i kø:>,
<*19*><:kø er tom:>,
<*20*><:ej forbindelse :>,
<*21*><:ingen at gennemstille til:>,
<*22*><:ingen samtale at nedlægge:>,
<*23*><:ingen samtale at monitere:>,
<*24*><:syntaks:>,
<*25*><:syntaks, parameter mangler:>,
<*26*><:syntaks, skilletegn:>,
<*27*><:syntaks, parametertype:>,
<*28*><:operatør ukendt:>,
<*29*><:garageterminal ukendt:>,
\f
<*30*><:rapport kan ikke dannes:>,
<*31*><:systemfejl:>,
<*32*><:ingen fri plads:>,
<*33*><:gruppe for stor:>,
<*34*><:gruppe allerede defineret:>,
<*35*><:springsekvens for stor:>,
<*36*><:spring allerede defineret:>,
<*37*><:spring ukendt:>,
<*38*><:spring allerede igangsat:>,
<*39*><:bus ikke reserveret:>,
<*40*><:gruppe ikke reserveret:>,
<*41*><:spring ikke igangsat:>,
<*42*><:intet frit linie/løb:>,
<*43*><:ændring af dato/tid ikke lovlig:>,
<*44*><:interval-størrelse ulovlig:>,
<*45*><:ikke implementeret:>,
<*46*><:navn ukendt:>,
<*47*><:forkert indhold:>,
<*48*><:i brug:>,
<*49*><:ingen samtale igang:>,
<*50*><:kanal:>,
<*51*><:afvist:>,
<*52*><:kanal optaget :>,
<*53*><:annulleret:>,
<*54*><:ingen busser at kalde op:>,
<*55*><:garagenavn ukendt:>,
<*56*><:område ukendt:>,
<*57*><:område nødvendigt:>,
<*58*><:ulovligt område for bus:>,
<*59*><:radiofejl :>,
<*60*><:område kan ikke opdateres:>,
<*99*><:- <'?'> -:>));
\f
message procedure skriv_kvittering side 3 - 820301/hko;
if res=3 and op<>0 then
begin
if d.op.opkode=20 or d.op.opkode=11 then <*vogntabel,flyt -,indsæt*>
begin
i:= d.op.data(if d.op.opkode=20 then 4 else 3) extract 14;
if i<>0 then write(z,i,<: udtaget:>);
end;
end;
if res = 11 or res = 12 then
i:=ref;
if res=11 then write(z,i shift(-12) extract 10,
if i shift(-7) extract 5 =0 then false
else "A" add (i shift(-7) extract 5 -1),1,
<:/:>,<<d>,i extract 7) else
if res=12 then write(z,i extract 14) else
if res = 20 or res = 52 or res = 59 then
begin
i:= d.op.data(12);
if i <> 0 then skriv_id(z,i,8);
i:=d.op.data(2);
if i=0 then i:=d.op.data(9);
if i=0 then i:=d.op.data(8);
skriv_id(z,i,8);
end;
if pos>=0 then
begin
pos:=pos+1;
outchar(z,':');
tegn:=-1;
while tegn<>10 and tegn<>0 do
outchar(z,læs_tegn(d.op.data,pos,tegn));
end;
<*V*>setposition(z,0,0);
end skriv_kvittering;
\f
message procedure cursor, side 1 - 810213/hko;
procedure cursor(z,linie,pos);
value linie,pos;
zone z;
integer linie,pos;
begin
if linie>0 and linie<25
and pos>0 and pos<81 then
begin
write(z,"esc" add 128,1,<:Æ:>,
<<d>,linie,<:;:>,pos,<:H:>);
end;
end cursor;
\f
message procedure attention side 1 - 810529/hko;
procedure attention;
begin
integer array field op_ref,mess_ref;
integer array att_message(1:9);
long array field laf1;
boolean optaget;
procedure skriv_attention(zud,omfang);
integer omfang;
zone zud;
begin
write(zud,"nl",1,<:+++ attention :>);
if omfang <> 0 then
disable begin integer x;
trap(slut);
write(zud,"nl",1,
<:__op-ref:____:>,op_ref,"nl",1,
<:__mess-ref:__:>,mess_ref,"nl",1,
<:__optaget:___:>,if optaget then <:true:>else<:false:>,"nl",1,
<:__att-message::>,"nl",1,
<::>);
raf:= 0;
skriv_hele(zud,att_message.raf,18,127);
skriv_coru(zud,coru_no(010));
slut:
end;
end skriv_attention;
att_signal:=att_flag:=0;
trap(att_trap);
stack_claim((if cm_test then 198 else 146)+50);
<*+2*>
if testbit26 and overvåget or testbit28 then
skriv_attention(out,0);
<*-2*>
\f
message procedure attention side 2 - 810406/hko;
repeat
wait_ch(cs_att_pulje,opref,true,-1<*vent ubegrænset*>);
repeat
<*V*> c_wait_message(att_proc_ref,att_message,mess_ref,-1<*vent ubegrænset*>);
laf1:= 0;
laf:=core.mess_ref(4)+2; <* reference til sender-procesnavn *>
<*
i=101: consol 1
=201: terminal 1
=202: terminal 2
'
'
=208: terminal 8
=301: garage 1
=302: garage 2
'
'
=308: garage 8
else i=-1
*>
\f
message procedure attention side 3 - 830310/cl;
i:=if laf <= 0 then -1
else if core.laf(1)=konsol_navn.laf1(1)
and core.laf(2)=konsol_navn.laf1(2) then 101
else if core.laf(1)=long <:termi:> add 'n'
and core.laf(2) shift (-32) shift 32=long <:al:>
and core.laf(2) extract 24 =0 then
200+core.laf(2) shift (-24) extract 8 -'0'
else if core.laf(1)=long <:garag:> add 'e'
and core.laf(2) shift 8=0 then
300+(core.laf(2) shift(-40)-'0')
else -1;
if i=101 or (201<=i and i<=200+max_antal_operatører)
<* or (301<=i and i<=300+max_antal_garageterminaler) *>
then
begin
j:= if i=101 then 0 else 8*(i//100-2)+i mod 100;
ref:=j*terminal_beskr_længde;
att_message(9):=
if terminal_tab.ref.terminal_tilstand>=0 then 1 <*normal*>
else 4 <*disconnected*>;
optaget:=læsbit_l(att_flag,j);
if optaget and att_message(9)=1 then
sætbit_l(att_signal,j,<*1 for 'husket' attention*>0)
else optaget:=optaget or att_message(9)<>1;
end
else
begin
optaget:= true;
att_message(9):= 2 <*rejected*>;
end;
monitor(22)send_answer:(zdummy,mess_ref,att_message);
until -,optaget;
\f
message procedure attention side 4 - 810424/hko;
sætbit_l(att_flag,j,1);
start_operation(op_ref,i,cs_att_pulje,0);
signal_ch(case i//100 of (cs_io,cs_op,cs_gar),op_ref,gen_optype);
until false;
att_trap:
skriv_attention(zbillede,1);
end attention;
:5: attention: initialisering
\f
message attention_initialisering side 1 - 850820/cl;
tf_kommandotabel:= 1 shift 10 + 1;
begin
integer i, s, zno;
zone z(128,1,stderror);
integer array fdim(1:8);
fdim(4):= tf_kommandotabel;
hentfildim(fdim);
open(z,4,<:htkommando:>,0);
for i:= 1 step 1 until fdim(3) do
begin
inrec6(z,512);
s:= skrivfil(tf_kommandotabel,i,zno);
if s<>0 then fejlreaktion(6,s,<:kommandotabelinit:>,0);
tofrom(fil(zno),z,512);
end;
close(z,true);
end;
\f
message attention_initialisering side 1a - 810428/hko;
for j:= system(3,i,terminal_tab) step 1 until i do
terminal_tab(j):= 0;
cs_att_pulje:=next_semch;
<*+3*> skriv_new_sem(out,3,cs_att_pulje,<:cs-att-pulje:>);
<*-3*>
bs_fortsæt_adgang:= nextsem;
<*+3*> skriv_new_sem(out,1,bs_fortsæt_adgang,<:bs-fortsæt-adgang:>);
<*-3*>
signalbin(bs_fortsæt_adgang);
for i:= 1,
1 step 1 until max_antal_operatører,
1 step 1 until max_antal_garageterminaler do
<* initialisering af pulje med attention_operationer *>
signalch(cs_att_pulje, <* pulje_semafor *>
nextop(data+att_op_længde), <* næste_operation *>
gen_optype);
att_proc_ref:=next_proc_ext(system(6<* own process*>,i,ra));
i:=next_coru(010,<*ident*>
5,<*prioritet*>
true<*test_maske*>);
j:=newactivity( i, <*activityno *>
0, <*ikke virtual *>
attention);<*ingen parametre*>
<*+3*>skriv_newactivity(out,i,j);
<*-3*>
▶EOF◀