DataMuseum.dk

Presents historical artifacts from the history of:

RC4000/8000/9000

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

See our Wiki for more about RC4000/8000/9000

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download

⟦00360063a⟧ TextFile

    Length: 23808 (0x5d00)
    Types: TextFile
    Names: »twatchdog   «

Derivation

└─⟦9ccaf6601⟧ Bits:30008165 Bånd med SW8000 kildetekst/release værktøjer
    └─⟦2ba378e4a⟧ 
        └─⟦this⟧ »twatchdog   « 

TextFile

(watchdog=slang list.no xref.no
watchdog)

; ehp 1981.03.02
;
; version 1981.03.02
; version 1981.06.24
;
; 90 08 13 08.32 kak   error records from LAN and IOC devices included

; the program receives error-records from  !errorlog!  and
; writes these on  !rclogarea!.
; the  !rclogarea!  must have been created before start of program.
;
;
; the internal process, in which the program is running, is
; started with the following s-commands:
;
;     new errorsnoop size 1100 buf 2 area 1 mode 0
;     base -8388607 8388605 prog watchdog perm disc 0 0 run
;
;
; error messages:
;       <:no errorlog<10>:>
;            the external process, !errorlog!, is not included
;            in the monitor. this process is needed to get the
;            error-records.
;       <:no rclogarea<10>:>
;       <:no buffercore<10>:>
;
; all texts (also error-messages) are sent to the output-terminal defined
; by   a1.   default:  device 2 (main-console).
;
; when the internal process is created correctly, the program
; will write on the output-terminal:
;       <:start<10>:>
; the program will now receive error-records from
; !errorlog! and update these in !rclogarea!.
; a message with the second word equal to the text  <:sto:>
; will cause the program to update the the last  error-records
; at bs-area and finis with an <em> character on this.
; the  !rclogarea!  is released, when the text  <:stop<10>:>
; is written on the output-terminal.
; the program can be started again by a new message
; with the second word equal to the text <:sta:>.
;
; in case of error during output to the bs-area, or when the
; bs-area is full, the program write on the output-terminal the
; text <:stop<10>:>.
;
;
\f



b.g5                       ; begin
w.                         ;
d.
p.<:fpnames:>
l.
g2:                        ;
s.a5,b40,e8,f40,q99        ; begin
w.                         ;
  a0 = 510                 ; size of error log buffer
;***output-terminal:
  a1 = 2<1                 ; device no of output-terminal shift 1
  a2 = 74                  ; size of max record
  a3 = 34                  ; size of std record
  a4 = 32                  ; addr(time in record)

q6 = 6                     ; ioc disc
q8 = 8                     ; csp terminal
q18=18                     ; idatape
q20=20                     ; ida main
q26=26                     ; dlc main
q28=28                     ; generel sekvential device (DLC)
q62=62                     ; disc
  b0: <:errorlog:>,0       ; name of error log process
      0                    ;  used by send message
  b1: 19<12                ; error log message
      0                    ;  first address
  b2: 0                    ;  last address
  b25:0                    ;  proc descr addr
  b3: <:rclogarea:>,0      ; name of log area
      0                    ;  used by send message
  b4: 5<12                 ; log area message
      0                    ;  first address
  b5: 0                    ;  last address
  b6: 0                    ;  segment no
  b8: 0                    ; message buffer address
  b9: 0,r.8                ; answer
  b10:0,0,0,0              ; name of console
      0                    ;  used by send message
      0,r.5                ; name of parent terminal
  b11:5<12                 ; console message
      0                    ;  first address
  b12:0                    ;  last address
  b29:1<20                 ; data overrun(event status - disc)
  b35:1<21                 ; timeout(event status - transmit)
  b38:0,r.10               ; tail

  b14:<:start<10>:>        ;
  b15:<:stop<10>:>         ;
  b16:<:on<0>:>            ;
  b17:<:off:>              ;
  b26:<:proc  :>           ;
  b18:0,r.4                ; procname
  b19:<:<10><0><0>:>       ; nl
  b20:0                    ; outerror
  b21:0                    ; switch
  b22:<:wrk:>              ;
  b23:<:addr     0:>       ;
  b24:0                    ; no of records
  b36:0,r.5                ; parent name


; procedure out segment(link):
; comments: outputs the error log buffer on the log area;
; in case of unacceptable result or status, it returns to
; !type stop!.
;     call:                return:
; w0                       next segment no
; w1                       destroyed
; w2                       destroyed
; w3  link                 destroyed
;
b.i5,j6 w.                 ; begin
i0:   0                    ; increase count;
i1:   16<12+1,<:rclogarea bs claim rq:>,0
i2:   2<12+1<5+0,<:rclogarea error:>,0,0
e0:                      ; out segment:
      rs. w3  b37.         ;   save link;
      al  w0  0            ;
      rs. w0  i0.          ;   increase count:=0;
j0:   al. w3  b3.          ;
      al. w1  b4.          ;
      jd      1<11+16      ;   send message(message,name;buf);
      al. w1  b9.          ;
      jd      1<11+18      ;   wait answer(buf;result,answer);
      se  w0  1            ;   if result <> 1 then
      jl.     j5.          ;     goto type stop;
      bz. w1  b9.          ;
      sn  w1  0            ;   if status < 0 then
      jl.     j6.          ;   begin
j1:   rl. w2  b9.+2        ;
      so  w1  (224)        ;   if end of file or
      se  w2  512          ;      halfwords transferred<512 then
      sz                   ;   goto increase 
      jl.     j5.          ;   else goto stop
      rx. w1  i0.          ; increase:
      se  w1  0            ;   in -,first time then
      jl.     j5.          ;   goto stop else
      al. w1  b38.         ;   tail addr
      jd      1<11+42      ;   lookup_entry(<:rclogarea:>,tail);
      rl  w2  x1           ;
      al  w2  x2+1         ;   increase
      rs  w2  x1+0         ;   size of file      
      jd      1<11+44      ;   change_entry(<:rclogarea:>,tail);
      sn  w0  0            ;   if size increased then
      jl.     j0.          ;   goto output
      sn  w0  6            ;   if claim exceeded then
      am      i1-i2        ;   parent mess: bs wait
j5:   al. w1  i2.          ;   stop
      rs. w0  i2.+14       ;   insert result
      al  w0  0            ;
      rs. w0  i0.          ;   clear increase count
      al. w3  b36.         ;   parent name
      jd      1<11+16      ;   send_message(parent,message);
      al. w1  b9.          ;   answer address
      jd      1<11+18      ;
      jl.     j0.          ;   if answer <*from bs wait*> then goto output
j6:   al  w0  1            ;
      wa. w0  b6.          ;
      rs. w0  b6.          ;   segment no:= segment no + 1;
      jl.    (b37.)        ;   goto saved link;

e.                         ; end of out segment;


; procedure check message(buf,link;switch):
; comments: if word(message+10) contains the text <:sta:>,<:sto:>,<:on<0>:>
; or <:off:>, an answer is sent with result 1 and return is taken to link + 2;
; the same is done, if word(message+10) contains the text <:pro:> and
; word(message+18) is zero or equal to a device process description address;
; if not, an answer is sent with result 2 and return is taken to
; link;
; if buffer claim exceeded, return is taken to wait event.
;     call:                return:
; w0                       switch (if return to link+2)
; w1                       destroyed
; w2  buf                  destroyed
; w3  link                 destroyed
;
b.j10                      ; begin
w.e1: al  w3  x3+1         ; check message1:
  e2: sn  w2  0            ; check message2:  if buf = 0 then
      jl.     f7.          ;     goto wait event;
      rs. w2  b21.         ;   switch:= buf;
      rl. w0  b24.         ;
      rs. w0  b9.          ;   word(answer):= no of records;
      rl  w0  x2+10        ;   text:= word(buf+10);
      sn. w0 (b26.)        ;   if text = <:pro:> then
      jl.     j5.          ;     goto check proc;
      se. w0 (b16.)        ;   if text = <:on:>
      sn. w0 (b17.)        ;   or text = <:off:> then
      jl.     j3.          ;     goto set;
      sz  w3  2.1          ;   result:=
      am      b14-b15      ;     if text = (if link(23) <> 0 then <:sta:>
      sn. w0 (b15.)        ;       else <:sto:>) then
  j1: am      1-2          ; res1:       1
  j2: al  w0  2            ; res2:  else 2;
      jd      1<11+26      ;   get event(buf);
      al. w1  b9.          ;
      jd      1<11+22      ;   send answer(result,answer,buf);
      se  w0  1            ;   if result <> 1 then
      jl      x3+0         ;     goto link;
      rl. w0  b21.         ;   get switch;
      jl      x3+2         ;   goto link +2;
  j3: rs. w0  b20.         ; set:  outerror:= text;
      al  w0  10           ;
      rs. w0  b21.         ;   switch:= 10;
      jl.     j1.          ;   goto res1;
  j5:                      ; check proc:
      rl  w0  x2+18        ;   addr:= proc descr addr(mess+18);
      sn  w0  0            ;   if addr = 0 then
      jl.     j7.          ;     goto found;
      rl  w1  74           ;   nameaddr:= first device in name table;
      al  w1  x1-2         ;   nameaddr:= nameaddr - 2;
  j6: al  w1  x1+2         ; next:  nameaddr:= nameaddr + 2;
      sl  w1 (76)          ;   if nameaddr >= first area in name table then
      jl.     j2.          ;     goto res2;
      se  w0 (x1+0)        ;   if addr <> word(nameaddr) then
      jl.     j6.          ;     goto next;
  j7: rs. w0  b25.         ; found:  proc descr addr:= addr;
      rs. w3  b37.         ;   save link;
      rl  w3  0            ;
      sn  w3  0            ;   if addr = 0 then
      al. w3  b23.-2       ;     addr:= addr(text(<:addr 0:>) - 2);
      dl  w1  x3+4         ;
      ds. w1  b18.+2       ;
      dl  w1  x3+8         ;   move proc name or text
      ds. w1  b18.+6       ;     to procname;
      al  w3  0            ;
      rs. w3  b21.         ;   switch:= 0;
      rl. w3  b37.         ;   unsave link;
      jl.     j1.          ;   goto link;
e.                         ; end of check message;


; procedure type(text,link):
; comments: writes a text on the output-terminal.
;     call:                return:
; w0                       destroyed
; w1                       destroyed
; w2                       destroyed
; w3  link                 destroyed
;
b.j5                       ; begin
w.e3: rl. w0  b20.         ; checkout:
      am.    (b2.-2)       ;
      rl  w1  28           ;
      se. w1 (b25.)        ;   if cur proc(record) = proc descr addr
      se. w0 (b16.)        ;   or outerror <> <:on:> then
      jl      x3+0         ;     goto link;
      al. w1  b18.         ;   first addr:= addr(procname);
      al. w2  b19.         ;   last addr:= addr(nl);
      jl.     e8.          ;   goto type3;
  e4: al. w1  b26.         ; type5:  first addr:= addr(<:proc:>);
      al. w2  b19.         ;   last addr:= addr(nl);
      jl.     e8.          ;   goto type3;
  e5: am      b20-b14      ; type4: text:= addr(outerror)
  e6: am      b14-b15      ; type1: or <:start:>
  e7: al. w1  b15.         ; type2: or <:stop:>;
      al  w2  x1+2         ;
  e8: ds. w2  b12.         ; type3:  save first and last address;
      rs. w3  b37.         ;   save link;
      al. w3  b10.         ;
      al. w1  b11.         ;
      jd      1<11+16      ;   send message(message,name;buf);
      al. w1  b9.          ;
      jd      1<11+18      ;   wait answer(buf;result,answer);
      bz. w1  b9.          ;
      sn  w0  1            ;   if result <> 1 
      se  w1  0            ;   or status <> 0 then
      jl.     j1.          ;     goto repeat;
      jl.    (b37.)        ;   goto saved link;
  j1: al. w1  b11.         ;   error at primary output terminal:try parent terminal
      al. w3  b10.+10      ;
      jd      1<11+16      ;   send message(message,name;buf);
      al. w1  b9.          ;
      jd      1<11+18      ;   wait answer(buf;result,answer);
      jl.    (b37.)        ;   goto saved link;
e.                         ; end of type;

  b37:        0            ; saved link(common for e0.,e1.,...,e8.)


; central code: 
;
w.
f0:                        ; wait for start:
      al  w2  0            ;   event:= 0;
      jd      1<11+24      ;   wait event(event;result,next);
      jl. w3  e1.          ;   check message1(buf,link;switch);
      jl.     f0.          ;     if rejected then goto wait for start;
      sl  w0  0            ;   if switch < 0
      sl  w0  11           ;   or switch >= 11 then
      jl.     f1.          ;     goto start;
      se  w0  0            ;   if switch <> 0 then
      am      e5-e4        ;     type4(outerror,link)
      jl. w3  e4.          ;   else type5(proc,link);
      jl.     f0.          ;   goto wait for start;
  f1: al. w3  b3.          ; start:
      jd      1<11+8       ;   reserve process(name;result);
      se  w0  0            ;   if result <> 0 then
      jl.     f20.         ;     goto type stop;
      rs. w0  b6.          ;   segment no:= 0;
      rs. w0  b24.         ;   no of records:= 0;
      rl. w2  b5.-2        ;   get first address;
      dl  w1  110          ;
      ds  w1  x2+a4        ;   move(time, error log + addr(time));
      jl. w3  e0.          ;   out segment(link);
  f2:                      ; type start:
      jl. w3  e6.          ;   type1(<:start:>,link);
  f3:                      ; init:
      rl. w2  b5.-2        ;   get first addr;
      al  w3  x2+a2        ;   last addr:= first addr + size of max record;
      ds. w3  b2.          ;   save first and last addr in error log mess;
      jl.     f5.          ;   goto clear;
  f4: jl. w3  e3.          ; check:  checkout(link);
  f5: rl. w2  b2.-2        ; clear:
      al  w0  25           ;
      rs  w0  x2+0         ;   word(first addr):= 25;
      al. w3  b0.          ;
      al. w1  b1.          ;
      jd      1<11+16      ;   send message(message,name;buf);
      rs. w2  b8.          ;   save buf address;
  f6:                      ; wait event0:
      al  w2  0            ;   event:= 0;
  f7: jd      1<11+24      ; wait event:  wait event(event;result,buf);
      se  w0  1            ;   if result <> 1 then
      jl.     f21.         ;     goto exam message;
      rl  w0  x2+10        ;
      rs. w0     b9.+2     ;   save no of hw
      rl  w0  x2+4         ;   result:= receiver(buf);
      jd      1<11+26      ;   get event(buf);
      se  w0  1            ;   if result <> 1 then
      jl.     f20.         ;     goto type stop;
      rl. w1  b2.-2        ;   addr:= first addr(error log mess);
      bz  w0  x1+0         ;   kind:= byte(addr);
      bz  w3  x1+1         ;   localkind:= byte(addr+1);
      sl  w0     6         ;   if 6<= kind <=28 then <* LAN/IOC device *>
      sl  w0     29        ;
      jl.        f9.       ;   begin
      rl  w3     0         ;     local_kind:=kind;
      sn  w3     q18       ;     if idatape then 
      jl.        f12.      ;       goto idatape
      se  w3     q8        ;     if -,terminal then 
      jl.        f19.      ;      goto update
      bz  w3  x1+34        ;
      jl.        f10.      ;     goto test terminal status
                           ;   end else
f9:   sl  w0  84           ;   if kind < 84
      sl  w0  86           ;   or kind >= 86 then
      jl.     f16.         ;     goto disc;
      se  w3  8            ;   if localkind <> 8 then
      jl.     f11.         ;     goto magtape;
      bz  w3  x1+18        ;   status:= byte(addr+18);
;***terminal: (2 lines)
f10:  sn  w3  1<9          ;   if status = timer then
      jl.     f5.          ;     goto clear;
      jl.     f19.         ;   goto update;
  f11:                     ; magtape:
;***magtape: (1 line)
      se  w3  18           ;   if localkind <> 18 then
      jl.     f13.         ;     goto cardreader;
f12:  rl  w3  x1+2         ; name:
      sn. w3 (b22.)        ;   if word(addr+2) = <:wrk:> then
      jl.     f5.          ;     goto clear;
      jl.     f19.         ;   goto update;
  f13:                     ; cardreader:
;***cardreader: (1 line)
      se  w3  16           ;   if localkind <> 16 then
      jl.     f15.         ;     goto reader;
      rl  w3  x1+18        ;
      sh  w3  -1           ;   if status(record) <= -1 then
      jl.     f5.          ;     goto clear;
      jl.     f19.         ;   goto update;
  f15:                     ; reader:
;***reader: (1 line)
      se  w3  10           ;   if localkind <> 10 then
      jl.     f19.         ;     goto update;
      bz  w3  x1+18        ;
      sn  w3  1<9          ;   if status = timer then
      jl.     f5.          ;     goto clear;
      jl.     f19.         ;   goto update;
  f16:                     ; disc:
;***disc: (1 line)
      se  w0  62           ;   if kind <> 62 then
      jl.     f18.         ;     goto tra;
      rl  w3  x1+24        ;
      la. w3  b29.         ;
      se  w3  0            ;   if event status(record) <> 0 then
      jl.     f5.          ;     goto clear;
      rl  w3  x1+2         ;
      bz  w2  x1+10        ;
      sn. w3 (b22.)        ;   if word(addr+2) <> <:wrk:>
      se  w2  0            ;   or oper(addr+10) <> 0 then
      jl.     f19.         ;     goto update;
      jl.     f5.          ;   goto clear;
  f18:                     ; tra:
;***fpa: (1 line)
      se  w0  88           ;   if kind <> 88 then
      jl.     f19.         ;     goto update;
      rl  w3  x1+18        ;
      rl  w2  x1+24        ;   event:= event status(first sense)
      ws. w2  b35.         ;     - timeout;
      se  w3  0            ;   if channel(first sense) = 0
      sn  w2  0            ;   or event = 0 then
      jl.     f5.          ;     goto clear;
  f19:                     ; update:
      dl  w3  x1+4         ;
      ds. w3  b18.+2       ;
      dl  w3  x1+8         ;   move record name
      ds. w3  b18.+6       ;     to proc name;
      al  w2  1            ;
      wa. w2  b24.         ;   no of records:=
      rs. w2  b24.         ;     no of records + 1;
c. -1
      al  w2  x1+a3        ;   first addr:= addr + size of std record;
      se  w0  86           ;   if kind = 86 or kind = 88 then
      sn  w0  88           ;     first addr:= first addr - size of std
      al  w2  x2-a3+a2     ;       record + size of max record;
      al  w3  x2+a2        ;   last addr:= first addr + size of max record;
z.
      al  w2  x1           ;
      wa. w2     b9.+2     ;   first addr:=old first addr+number of halfwords received
      al  w3  x2+a2        ;   last addr:=first addr + max buff size

      ds. w3  b2.          ;   save first and last addr;
      al  w3  x3-2         ;
      sh. w3 (b5.)         ;   if last addr <= last addr(log area mess) then
      jl.     f4.          ;     goto check;
      jl. w3  e3.          ;   checkout(link);
      jl. w3  e0.          ;   out segment(link;segment no);
      jl.     f3.          ;     goto init;
  f20:                     ; type stop:
      al. w3  b3.          ;
      jd      1<11+10      ;   release process(name);
      jl. w3  e7.          ;   type2(<:stop:>,link);
      jl.     f0.          ;   goto wait for start;
  f21:                     ; exam message:
      jl. w3  e2.          ;   check message2(buf,link;switch);
      jl.     f6.          ;     if rejected then goto wait event0;
      se  w0  0            ;   if switch <> 0 then
      jl.     f22.         ;     goto check10;
      rl. w2  b8.          ;   buf:= saved buf address;
      jd      1<11+82      ;   regret message(buf);
      jl. w3  e4.          ;   type5(proc,link);
      jl.     f5.          ;   goto clear;
  f22:se  w0  10           ; check10:  if switch <> 10 then
      jl.     f23.         ;     goto stop;
      jl. w3  e5.          ;   type4(outerror,link);
      jl.     f6.          ;   goto wait event0;
  f23:rl. w2  b8.          ; stop:  buf:= saved buf address;
      jd      1<11+82      ;   regret message(buf);
      jl. w3  e0.          ;   out segment(link);
      jl.     f20.         ;   goto type stop;
;
; end of central code;

  b40:        0,r.50       ; first word(buffer);


; init code:
;
; comments: the following code
;    1)  initialize the name of the terminal by means of
;        !device no of output-terminal!,
;    2)  initializes the !errorlog!,
;    3)  creates and reserves an area process for the !rclogarea!,
;        and output the time in segment 0,
;    4)  and examines whether there is room for the log
;        buffer or not.
; in case of an unacceptable result during this job, an error
; message is send to the output-terminal
; and the program will be running after error.
;
b. i12 w.
g5:   ds. w1  i4.                       ; entry point:
      ds. w3  i6.          ; save w0,w1=pda.parent,w2=pda.console,w3=pda.own
      dl  w0  x2+4         ;   move
      ds. w0  b10.+12      ;   parent console name to
      dl  w0  x2+8         ;   to buffer
      ds. w0  b10.+16      ;
      dl  w0  x1+4         ;   move parent name to proc
      ds. w0  b36.+2       ;
      dl  w0  x1+8         ;
      ds. w0  b36.+6       ;
      al  w1  a1           ;   proc:=
      wa  w1  74           ;     + first device in name table);
      rl  w1  x1           ;
      dl  w3  x1+4         ;
      ds. w3  b10.+2       ;
      dl  w3  x1+8         ;
      ds. w3  b10.+6       ;   name of output-terminal:= name(proc);
      al. w3  b0.          ;
      jd      1<11+4       ;   process description(name;result);
      sn  w0  0            ;   if result = 0 then
      jl.     i10.         ;     goto error0;
      al. w3  b3.          ;
      al. w1  b38.         ;
      jd      1<11+42      ;   lookup entry(tail,name;tail);
      jd      1<11+52      ;   create area process(name);
      jd      1<11+8       ;   reserve process(name;result);
      se  w0  0            ;   if result <> 0 then
      jl.     i11.         ;     goto error1;
      rl. w1    i6.        ;
      rl  w1  x1+24        ;   top address:= top address(own process);
      al. w2  b40.         ;   first address:= addr(first address(buffer));
      al  w3  x2+a0        ;   last address:= first address + size of error log buffer;
      sl  w3  x1+0         ;   if last address >= top address then
      jl.     i12.         ;     goto error2;
      ds. w3  b2.          ;   save first and last address in error log
      ds. w3  b5.          ;     message and log area message;
      dl  w1  110          ;
      ds  w1  x2+a4        ;   move(time, error log + addr(time));
      jl. w3  e0.          ;   out segment(link);
      jl.     f2.          ;   goto type start;

  i0: 2<12+0,<:no errorlog:>,0,0,0
  i1: 2<12+0,<:no rclogarea:>,0,0,0
  i2: 2<12+0,<:proc size too small:>,0

  i3: 0                    ; saved w0
  i4: 0                    ;       w1: pda of parent
  i5: 0                    ;       w2: pda of parent console
  i6: 0                    ;       w3: pda of errorsnoop process

  i10:am      i0-i1        ; error0
  i11:am      i1-i2        ; error1
  i12:al. w1  i2.          ; error2
      al. w3  b36.         ;
      jd      1<11+16      ; send finis message to parent
      jl.     0            ; and wait
e.
; end of init code;
e.                         ; end of central codesegment;


; information for insertproc:
;
  g3:                      ;
  g0: g1:                  ; first and last tail
      (:g3-g2+511:) > 9    ; no of segments
      0,0,0,0              ; name
      0                    ; date
      0                    ;
      0                    ;
      3<12+g5-g2           ; contents, entry
      g3-g2                ; length
d.
p.<:insertproc:>

scope user watchdog
▶EOF◀