DataMuseum.dk

Presents historical artifacts from the history of:

RC3500

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

See our Wiki for more about RC3500

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download

⟦8cddec29b⟧ TextFileVerbose

    Length: 3840 (0xf00)
    Types: TextFileVerbose
    Names: »tssdok«

Derivation

└─⟦a41ae585a⟧ Bits:30001842 SW-save af projekt 1000, Alarm-system
    └─⟦72244f0ef⟧ 
        └─⟦this⟧ »tssdok« 

TextFileVerbose

process tssuper ( tss_sem: semaphore );

const
                (*  options  *)
maxmno  = 2**4;        (* 4 bits for messagenumber  *)
maxnc   = 2**12;       (*  12 bits for nc,ts        *)
prival (0..15):= 1,1,2,3,3,1,1,1,1,2,1,2,2,1,1,1;
maxprio = 3;           (*  max ( prival )           *)
fromtss = 10??;        (*  u3 for messages to netc  *)
adrerror= 1*maxmno+1;  (*     op = (1.1)            *)
errorhan=  ??          (* dc-errorhandler microadr  *)
at_limit= 256;         (* routing by microadr       *)
vc_limit=   8;         (* routing by microadr       *)


var
   ts_macro : integer:= 0;        (*  dc-nc-ts          *)
   dc_running : boolean := false;     (*  controls log      *)
   msg_ready : integer := 0;         (*  controls wait on input_sem  *)



procedure book ( kind: module; ticks: integer);
(*  booking of a module_timeout at timeout    *);
begin
end;



procedure update ( kind: module );
(*  update tick_counter for a module at time_out   *);
begin
end;



procedure module_time_out ( msg: reference; var result: integer);
(*   for each different microadr  do   *)
begin
broadcast ( who, tsdown, receiver );
book ( kind, -1)    again
end;

\f



procedure downwards ( msg: reference );
begin   (*  messages from net     *)
if rec_maco <> ts_macro then
begin    (*  not for me  *)
adrerror;
result:= empty
end   else
begin    (*  macro ok    *)
if xmt_dc <> owndc and dc_running then log ( msg);
if opcode member in config then start_lam ( msg );
route ( rec_micro, ath, vch, tss);
result:= ok
end;
end;



procedure upwards ( msg: reference ; var result: integer );
begin    (*  message from a handler  *)
msg^.xmt_macro:= ts_macro;
if dc_running then log ( msg );
if rec_macro = ts_macro then route ( micro, tss, ath, vch )
  else rec:= netc;
result:= ok
end;




procedure tss_function ( msg: reference ; var result: integer );
begin   (*  handle messages for the tss-supervisor   *)
case functiongroup of
6:   new_at ( msg);
7:   new_vc ( msg);
9:   newlam ( msg);
11:  var_update ( msg);
12:  watch ( msg)
otherwise      (*  do nothing  *)
end;   (*  case  *)

return ( msg );
end;

\f



begin            (*     main program        *)

start ( timeout );
start ( bum );
start ( netcon);   book ( netc, -1);   send ( netc, read);
start ( athan );   book ( ath, -1);    send ( ath, read);
start ( vchan );   book ( vch, -1);    send ( vch, read);
book ( traffic, -1);
book ( ncs, -1);

repeat         (*  forever  *)
while open ( tss_sem ) or ( msg_ready=0 ) do
begin   (*  take all messages and distribute to internal sem  *)
wait ( msg, tss_sem);     (*  effective wait only if idle is true  *)
if msg^.u3<> tim then send ( msg^.u3, read);        (*  distribute read-buffer  *)
if msg^.opcode = lytte then  return ( msg )  else
begin
idle:= false;
group:= msg^.opcode/maxmno;     (*  functiongroup decides priority  *)
signal ( msg, mysem(prival(group)))
end
end;



(*    find highest used priority     *)
for p:= 1 to maxprio do
  if open ( mysem(p)) then prio:= p;

wait ( msg, mysem(prio));
msg_ready:= msg_ready - 1;

case msg^.u3 of
fromtimer:     module_timeout ( msg, result );
from_net:      downwards ( msg, result );
otherwise      upwards ( msg, result );
end;

case result of
dummy:          ;
empty:      return ( msg);
tss:       tss_function ( msg );
vch:       signal ( msg, vch_sem);
ath:       signal ( msg, ath_sem);
netc:      begin
signal ( msg, netc_sem);
update ( traffic)
end
end   (*  case  *)

until forever
end .
«eof»