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

⟦8ebb1b214⟧ TextFile

    Length: 82944 (0x14400)
    Types: TextFile
    Names: »complex«

Derivation

└─⟦621cfb9a2⟧ Bits:30002817 RC8000 Dump tape fra HCØ.  Detaljer om "HC8000" projekt.
    └─⟦0364f57e3⟧ 
        └─⟦this⟧ »complex« 
└─⟦00964e8f7⟧ Bits:30007478 RC8000 Dump tape fra HCØ.
    └─⟦b2ec5d50f⟧ 
        └─⟦this⟧ »complex« 

TextFile

\f


skip 35.1




               vedr.   e r r o r l o g - c o m p l e x .
               =========================================




               1.0   noget om navne

               2.0   "complex"

                     2.1   opstart af "errorsnoop"

                     2.2   udskrivning af "rclogarea" under boss

                     2.3   udskrivning af "rclogarea" under s

               3.0   "errorsnoop"

               4.0   "outrclog"

                     4.1   overskrift

                     4.2   disc

                     4.3   fpa

                     4.4   subprocess

                     4.5   break

               5.0   "rclog"


               a.    referencer

               b.    error-record format

               c.    de vigtigste ukommenterede værdier i udskriften
                     fra "outrclog"
\f


1.0   noget om navne:
=====================


     "complex"      er en text-fil, der indeholder de fp-kommandoer og program-
                    texter, der er nødvendige for at benytte "errorlog"-
                    faciliteten i rc8000's monitor fra release 6.0;
                    se 2.0.


     "errorlog"     er en ekstern process, der findes i rc8000's monitor fra
                    release 6.0;
                    denne process gør det muligt at hente information om visse
                    breaks og om de fejl, der sker på disc, fpa og subprocess;
                    i det følgende vil disse informationer, omtales som
                    error-records.
                    ref.16.


     "errorsnoop"   er en intern process, der v.h.a. et slang-program, modtager
                    error-records fra  "errorlog"  og skriver disse på en bs-fil.
                    se 3.0.


     "watchdog"     er et slang-program, der kører i  "errorsnoop".


     "rclogarea"    er en bs-fil, hvori  "errorsnoop"  skriver error-records.


     "outrclog"     er et algol-program, der udskriver error-records fra
                    "rclogarea"  på en rimelig fornuftig måde.
                    se 4.0.


     "rclog"        er et newjob, der sørger for det praktiske ved udskrivningen
                    fra "rclogarea"  -  diverse messages til  "errorsnoop"  og
                    kald af  "outrclog".
                    se 5.0.


     "log"          er en bs-fil, der oprettes til udskrivning af "rclog",
                    hvis  lp  ikke kan reserveres.
\f


2.0   complex
=============


     "complex"  er en text-fil, der indeholder de fp-kommandoer og program-
     texter, der er nødvendige for at benytte  "errorlog"-faciliteten i
     rc8000's monitor fra release 6.0.


     implementering:



     1)   lav en all-process og tast:

               i complex

          følgende områder vil blive oprettet på disc med user-base:

               rclogarea   =  set 108   ;
               watchdog    =  set   2   ; slang-program
               outrclog    =  set  56   ; algol-program
               rclog       =  set   1   ; newjob

     2)   indsæt et brugbart user-name og project-number i
          1.linie af "rclog".

     3)   dokumentation kan udskrives således (a4 høj):

               (i complex
               lp=copy 35.1
               end)

     herefter kan "errorsnoop" startes, se 2.1;
     vedr. udskrivning af error-records, se 2.2 og 2.3;

\f


2.1   således startes errorsnoop
================================

     *att s
     new errorsnoop size 1100 buf 2 area 1 mode 0
     ready

     *att s
     base -8388607 8388605 prog watchdog run bs disc 0 0
     ready

     from errorsnoop
     start

\f


2.2   således udskrives loggen under boss
=========================================

     *>>
     newjob rclog

     from errorsnoop
     stop
     start

     *att boss
     att no


således udskrives loggen under boss, hvis errorsnoop har skrevet stop
=====================================================================

     from errorsnoop
     stop

     *att boss
     newjob rclog

     from errorsnoop
     start

     *att boss
     att no


\f


2.3   således udskrives loggen under s
======================================

     *att s
     all xxx run
     ready

     to xxx
     i rclog

     from errorsnoop
     stop
     start

     to xxx
     *att s
     proc xxx remove
     ready


således udskrives loggen under s, hvis errorsnoop har skrevet stop
==================================================================

     from errorsnoop
     stop

     *att s
     all xxx run
     ready

     to xxx
     i rclog

     from errorsnoop
     start

     to xxx

     *att s
     proc xxx remove
     ready
\f


3.0   errorsnoop
================

     "errorsnoop" modtager error-records fra "errorlog" og udskriver disse
     i "rclogarea";

"errorsnoop" startes med følgende s-kommandoer:

      new errorsnoop size 1100 buf 2 area 1 mode 0
      prog watchdog base -8388607 8388605 run bs disc 0 0

fejl-udskrifter:

      no errorlog          ; den externe process "errorlog" findes ikke
                           ; i monitoren - monitor release tidligere end 6.0;

      no rclogarea         ; bs-filen "rclogarea" findes ikke;
                           ; opret området i en all-process:
                           ;     rclogarea=set 108 disc
                           ;     scope user rclogarea

      no buffercore        ; der er ikke plads til en buffer på 512 halfwords;
                           ; size ved opstart er for lille;

bemærk:   alle meddelelser (også fejl-udskrifter) fra "errorsnoop" udskrives
          på output-terminalen, der er defineret til device 2 (hovedconsolen);
          ønskes device-nummeret ændret, se under:  eventuelt.

ved korrekt opstart sker følgende:

      "rclogarea" reserveres og
      tidspunktet skrives i segment 0,
      <:start:> udskrives på output-terminalen,
      kommunikationen med "errorlog" begynder,
      der modtages en error-record af gangen,
      denne skippes i følgende tilfælde:

           disc:     hvis  <process-name> =  <:wrk:> 
                     eller 
                     hvis event status indeholder data overrun;

           fpa:      hvis transmitteren's channel program counter er 0
                     i first sense
                     eller
                     hvis transmitteren's event status i first sense indeholder
                     timeout;

           subproc:  hvis subkind = 18(magtape) og <process-name> = <:wrk:>
                     eller
                     hvis subkind =  8(terminal) og status indeholder timer;

           (hvis ovennævnte error-records ønskes registreret,
           se under:  eventuelt)

      alle øvrige error-records skrives i "rclogarea" fra
      segment 1 og til sidste segment,
      et segment indeholder fra 6 til 15 error-records;
      når "rclogarea" er fyldt op, frigives det og
      <:stop:> udskrives på output-terminalen;
\f



problemer:

      hvis result <> 1 eller status <> 0 i answer fra "rclogarea",
      frigives "rclogarea" og <:stop:> udskrives på output-terminalen;

      hvis result <> 1 eller status <> 0 i answer fra output-terminalen,
      gentages;
      bemærk:  "errorsnoop" kræver   mode 0 , da output-terminalen's
               reserver-ord nulstilles inden output til denne;

      under skrivning i "rclogarea" kommunikerer "errorsnoop" ikke med
      "errorlog";
\f


"errorsnoop" accepterer følgende messages fra andre interne processer:
      (alle messages besvares med et result og et answer -
      vedr. answer, se: answer format)

message format:
---------------

start:         +0:     0
               +2:   sta

      hvis "errorsnoop" har skrevet  <:stop:>:
               "rclogarea" reserveres og
               tidspunktet udskrives i segment 0,
               <:start:> udskrives på output-terminalen og
               kommunikationen med "errorlog" begynder;
               message besvares med result 1;

      hvis "errorsnoop" har skrevet  <:start:>:
               message besvares med result 2;

stop:          +0:     0
               +2:   sto

      hvis "errorsnoop" har skrevet  <:start:>:
               message til "errorlog" regrettes,
               den sidste error-record afsluttes med <25> (em) og
               udskrives i "rclogarea",
               der frigives,
               <:stop:> udskrives på output-terminalen
               message besvares med result 1;

      hvis "errorsnoop" har skrevet  <:stop:>:
               message besvares med result 2;

on:            +0:     0
               +2:  on<0>

               <:on:> udskrives på output-terminalen;
               <process-name> i alle efterfølgende error-records vil blive
               udskrevet på output-terminalen;
      bemærk,  at "errorsnoop" ikke kan registrerer andre
               error-records under udskrivningen;
               message besvares med result 1;

off:           +0:     0
               +2:   off

               <:off:> udskrives på output-terminalen;
               <process-name> fra accepterede error-records vil ikke blive
               udskrevet;
               message besvares med result 1;

alle øvrige messages returneres med result 2;
\f



answer format:
--------------

      alle messages, uanset result 1 eller 2, besvares med følgende
      answer:

                +0:  <number of error-records>

      det er altså muligt på et hvilket som helst tidspunkt at sende en
      uacceptabel  message  til "errorsnoop" og få at vide, hvor mange
      error-records, der er registreret på det pågældende tidspunkt;

      eks.:

           do x3.errorsnoop x1.0.0 send message wait answer write x1.2 end

      udskrift:

           x1.zzzzz

              +0    <number of error-records>

      ( zzzzz er en irrelevant lager-adresse )

      do kan naturligvis også anvendes til acceptable messages;

      eks.:

           do x3.errorsnoop x1.0.on send message wait answer write x1.2 end

      eller

           do x3.errorsnoop x1.0.stop send message wait answer write x1.2 end


eventuelt:
----------

      hvis output-terminalen ønskes ændret til et andet device-nummer, gøres
      følgende i  en all-process:

           complex = edit complex
           l./æ35æ/,
           l./;***output-terminal:/,
           l1, r/2/z/,f

      hvor  z  erstattes af et andet device-nummer;


      hvis alle error-records ønskes registreret, gøres følgende
      i en all-process:

           complex = edit complex
           l./æ35æ/,
           l./;***terminal:/, l1, r/ /;/, l1, r/ /;/,
           l./;***magtape:/, l1, r/ /;/,
           l./;***disc:/, l1, r/ /;/, l1, r/ /;/, l1, r/ /;/,
           l./;***fpa:/, l1, r/ /;/, l1, r/ /;/, l1, r/ /;/,
           f

      efter en eventuel editering, se 2.0;

      bemærk, at udskrift-programmet "outrclog" ikke udskriver error-records,
              hvis process-name begynder med <:wrk:>; se: 4.0.
\f


4.0   outrclog
==============


     "outrclog" er et algol-program, der udskriver de error-records, der måtte
     være registreret i "rclogarea", på en rimelig fornuftig måde;

     det er vigtigt, at det er den samme monitor ved udskrivningen som ved
     genereringen af error-records;

papir-format:  a4 - tværs


programkald:    programnavn  <bsfil>.tt

                tt  ::=  test / andet

        eks.    outrclog rclogarea.andet


"outrclog" stopper udskrivningen:

          1) hvis en error-record's første ord = em (<25>),
          2) hvis tidspunktet i en error-record, er tidligere end
             start-tidspunktet i segment 0 eller
          3) når hele området er udskrevet;


bemærk,   at alle error-records, hvis process-name begynder med <:wrk:>,
          ikke udskrives;
          det kan ændres på følgende måde i en all-process:

                complex=edit complex
                l./æ35æ/,
                l./<***wrk-name:/, l1, i/
                <*
                /, l3, i/
                *>
                /,
                f

          efter en eventuel editering, se: 2.0.


det følgende er en gennemgang af de 4 typer udskrifter, der kan forekomme:

          1) disc
          2) fpa-receiver, fpa-transmitter
          3) subprocess
          4) break

     hvor texter er omgivet af  <:  og  :>, refereres til konstante texter i
     udskriften;

     hvor texter er omgivet af  <   og   >, refereres til variable texter i
     udskriften;

\f


4.1   overskrift
----------------

1.linie   indledes med    <:rc8000:> ;

          efter           <:period:>

          angives start-tidspunkt for "errorsnoop" og udskrift-tidspunkt.

2.linie   efter

               <:error log for device no:>

          udskrives device-nummeret for fysisk-disc, fpa-receiver,
          fpa-transmitter eller subprocess;
          error-records udskrives i device-nummer-orden, dernæst i
          tids-orden;

          break  indledes med

               <:error log for special reasons:>

          og udskrives til sidst i tids-orden;

          <:page:>-tæller gælder for hvert device-nummer og break.

3.linie   afhængig af udskrift-type, indledes med:

          1)   <:disc:>      , hvis devicet er en disc-process
          2)   <process-name>  på receiver eller transmitter
                             , hvis devicet er en fpa-process
          3)   <:kind:>      , hvis devicet er en sub-process
          4)   <:procname:>  , hvis det er breaks.
\f


4.2   disc
----------

ref.2, 5, 6.

en error-record består af 2 linier, hvoraf den første linie angiver
<process-name> på

               area-processen,
               den logiske disc-process eller
               den fysiske disc-process;

hvis efterfølgende error-records har samme <process-name>, udskrives det ikke;
i så fald består en error-record kun af en linie;

error-recorden læses udfra overskriften (linie 3:8):

<:op:>         := operation;
               hvis denne er
                    0 (sense)   udskrives  <:sen:>
                    3 (input)       -      <:inp:>
                    5 (output)      -      <:out:>
               andre værdier udskrives som integer; hvis den efterfølgende
               <:op:> er den samme, udskrives <: - :>;

<:mode:>       := mode;
               udskrives som integer; er normalt 0;

<:first:>
<:addr :>      := first core address, hvor transporten er startet;

<:first:>
<:segm :>      := first segment number;
               første logiske eller fysiske segment nummer, hvor
               transporten er startet;
               hvis <process-name> angiver
                    en area-process    =>  logisk segment nummer
                    en logisk disc     =>  logisk segment nummer
                    en fysisk disc     =>  fysisk segment nummer
               da <process-name> normalt angiver en area-process, betyder det,
               at der skal lægges 1197 til, hvis det fysiske device er
               en stor disc, og 1050, hvis det er en lille, for at få
               det korrekte fysiske segment nummer;

<:cyl:>        := cylinder number;
               udregnes:
                 <:cyl:>:= <:first segm:> // segm.pr.cyl;
               segm.pr.cyl hentes fra den fysiske disc-process beskrivelse;
               <:cyl:> er kun korrekt, hvis  <:first segm:>  er det fysiske
               segment nummer;
               da <process-name> normalt angiver en area-process, betyder det,
               at der skal lægges 3 til, hvis det fysiske device er en stor
               disc, og 10, hvis det er en lille, for at få det korrekte
               cylinder nummer;
\f



<:hea:>        := head number;
               udregnes:
                 <:hea:>:= (<:first segm:>  mod  segm.pr.cyl) // segm.pr.track;
               segm.pr.cyl og segm.pr.track hentes fra den fysiske disc-process
               beskrivelse;
               <:hea:> er normalt altid korrekt, da logiske disce fylder
               hele cylindre;
               <:hea:> kan være efterfulgt af en <:*:>, der angiver, at
               transporten er foregået over flere heads;
                    if ( <:sec:> + <:tra seg:> ) > segm.pr.track then
                           <:*:>
                    else   <: :>;

<:sec:>        := sector;
               udregnes:
                 <:sec:>:= <:first segm:>  mod  segm.pr.track;
               <:sec:> er normalt altid korrekt, da logiske disce fylder
               hele cylindre;

<:tra:>
<:seg:>        := number of segments in current transfer;
               transportens størrelse i segmenter;

<:io:>         := io result;
               <:io:> er et result, der er genereret af monitoren;
               kan have følgende værdier og betydning:
                    0 normal termination      ; interrupt received
                    1 bus reject, busy        ; device not started.(ex.bit 23)
                    2 bus timeout, disconnect ; device not started.(ex.bit 22)
                    3 software timeout        ; no interrupt received
                    4 abnormal termination    ; interrupt received
                    5 waitprogram terminated  ; interrupt received
                    6 power restart           ; software generated

               hvis <:io:> er 1, 2, 3 eller 6, vil <:remain char:>, <:<cur>:>,
               <:<event>:> og <:<detailed>:> være 0;
               hvis <:io:> er 5, vil <process-name>, <:op:>, <:mode:>,
               <:first addr:>, <:first segm:>, <:cyl:>, <:hea:>, <:sec:> og
               <:tra seg:> være irrelevant;
               <:io:> = 4 betyder, at et interrupt er modtaget, men den
               sidst udførte kommando er hverken stop eller wait;

<:remain:>
<: char :>     := remaining character count;
               <:remain char:> er udefineret, hvis read eller write kommandoen
               ikke er udført;

<:< cur >:>    := current status;

<:< event >:>  := event status;

<:<detailed>:> := detailed status;

texten under

<:  <- cur -> < event > <--- detailed --->  :>

               læses
                     l
                     o
                     d
                     r
                     e
                     t
                       og skulle give et fingerpeg om, hvad de enkelte
               status-bit betyder; ubenyttede bit i current og event status
               udskrives ikke; bit 7 i detailed status benyttes ikke;
\f



texten under <:<cur>:> :

     <:power:>      := bit  0  power low
     <:local:>      :=  -   1  local
     <:seek :>      :=  -   5  seek error
     <:write:>      :=  -   8  write protect
     <:high :>      :=  -   9  high density
     <:mode :>      :=  -  10  mode
     <:dev.k:>      :=  -  16:23  devicekind

texten under <:<event:> :

     <:inter:>      := bit  0  intervention
     <:datae:>      :=  -   1  data error
     <:datao:>      :=  -   3  data overun
     <:hard :>      :=  -   4  hard error
     <:posit:>      :=  -   5  position error
     <:commu:>      :=  -  20  communication error
     <:irupt:>      :=  -  21  interrupt error
     <:busti:>      :=  -  22  bus timeout
     <:buspa:>      :=  -  23  bus parity error

texten under <:<detailed>:> :

     <:facec:>      := bit  0  interface check
     <:drivc:>      :=  -   1  drive status check
     <:powec:>      :=  -   2  powerfail check
     <:commc:>      :=  -   3  command sequence check
     <:cuins:>      :=  -   4  cu instruction execution incomplete
     <:datac:>      :=  -   5  data check
     <:datao:>      :=  -   6  data overrun
     <:.....:>      :=  -   7
     <:multi:>      :=  -   8  multiple or no unit selected
     <:secto:>      :=  -   9  sector- or index-error
     <:diagn:>      :=  -  10  check drive diagnostic
     <:-sync:>      :=  -  11  synccharacter not found
     <:-mark:>      :=  -  12  address mark not found
     <:atten:>      :=  -  13  read or write while attention
     <:-serv:>      :=  -  14  no servo clock
     <:+offs:>      :=  -  15  write and offset active
     <:-head:>      :=  -  16  no head select
     <:writf:>      :=  -  17  write fault
     <:offcy:>      :=  -  18  write or read and off cylinder
     <:wrrdf:>      :=  -  19  write and read fault
     <:voltf:>      :=  -  20  voltage fault
     <:headf:>      :=  -  21  head select fault
     <:seek :>      :=  -  22  seek-error
     <:writp:>      :=  -  23  write protect
\f



4.3   fpa
---------

ref.3, 4.

     en error-record består af 3 linier:

1. l i n i e

<:start:>      := start byte;
               alle transporter på fpa-linien begynder med en start-byte;
               de 8 bit betyder:

                    bit 0  :  blocknumber
                     -  1  :
                     -  2  :
                     -  3  :
                     -  4  :  data follows
                     -  5  :  header bit
                     -  6  :  data flag
                     -  7  :  special function

               special funktioner er:
                    1 1 1 1 1 1 1 1      master clear
                    1 1 0 1 1 1 1 1      accept master clear
\f



2. l i n i e

<:statu:>      := status byte;
               alle transporter bliver besvaret med en status-byte,
               der specificerer resultatet at transmissionen;
               de 8 bit betyder:

                    bit 0  :  blocknumber
                     -  1  :
                     -  2  :
                     -  3  :
                     -  4  :  block control
                     -  5  :    -      -
                     -  6  :  blocklength error
                     -  7  :  parity error

               blockcontrol(4:5) indeholder acceptance eller rejection af en
               modtaget header; feltet er dummy, hvis parity-bit er sat;
               blockcontrol kan have følgende værdier og betydning:

               bit 4:5

                   0 0  accepted
                   0 1  wait
                        operationen kan ikke blive modtaget i øjeblikket,
                        p.gr.a. manglende ressourcer i front-end;
                   1 0  skip
                        header og data bør skippes;
                   1 1  reject
                        uforståelig funktion eller linien ikke initieret;

anden linie fortsætter med de 5 første kommandoer af det channel-program,
som fpa-en har forsøgt at få udført;
følgende kommandoer og parametre kan forekomme:

               <:sen:>  sense
                        1.param    first word address
               <:rea1:> read continue
                        1.param    first word address
                        2.param    character count
               <:rea0:> read
                        1.param    first word address
                        2.param    character count
               <:*2*:>  illegal command
               <:wri1:> write continue
                        1.param    first word address
                        2.param    character count
               <:wri0:> write
                        1.param    first word address
                        2.param    character count
               <:wai:>  wait
               <:*5*:>  illegal command
               <:con:>  control
               <:sto:>  stop
\f



3. l i n i e

læses udfra overskriften (linie 3:8), der er delt op i 3 blokke; disse giver
information om de 3 sense-operationer, der kan have været udført i channel-
programmet, nemlig

               <:first:>          <:second:>          <:standard:>
               <:sense:>          <:sense :>          <:status  :>

hver blok giver information om:

<:channel:>    := current channel program address;

<:rem.ch.:>    := remaining character count;

<:<cur>:>      := current status;

<:<event>:>    := event status;

texten under

<:   <cur> <event>   :>

               læses
                     l
                     o
                     d
                     r
                     e
                     t
                       og skulle give et fingerpeg om, hvad de enkelte
               status-bit betyder i current og event status;
               ubenyttede bit udskrives ikke;
\f



texten under <:<cur>:> :

     <:disco:>      := bit  0  front-end disconnected
     <:dev.k:>      :=  -  21  device kind (receiver = 0; transmitter = 1)
     <:blo.o:>      :=  -  23  block orientated = 1

texten under <:<event>:> :

     <:reset:>      := bit  0  reset received from front-end
     <:parit:>      :=  -   1  parity error in medium
     <:timeo:>      :=  -   2  time-out
     <:blo.l:>      :=  -   4  block length error
     <:buspa:>      :=  -  20  bus parity error
     <:statu:>      :=  -  21  status transfer error
     <:busti:>      :=  -  22  bus time-out
     <:busco:>      :=  -  23  bus communication error

\f


4.4   subprocess
----------------

en error-record består af 1 linie, der læses ud fra overskriften (linie 3:4):

<:kind:>       := subkind;
               angiver, hvad subprocessen har været anvendt til;
               kan have følgende værdier og betydning:

                    0 general sequential device
                    4 area-process                  ref.5
                    6 disc                           -  7
                    8 typewriter                     -  8
                   10 papertape reader               -  9
                   12 papertape punch                -  10
                   14 lineprinter                    -  11
                   16 cardreader                     -  12
                   18 magnetic tape or casette       -  13, 14
                   22 diskette                       -  15

               hvis den efterfølgende <:kind:> er den samme, udskrives <: - :>;

<:procname:>   := name of process;
               hvis det efterfølgende <:procname:> er det samme,
               udskrives <: - :>;
\f



<: m e s s a g e :>

<:oper:>       := operation;
               hvis denne er
                    0 (sense)          udskrives  <:sen:>
                    3 (input)              -      <:inp:>
                    5 (output)             -      <:out:>
               yderligere for <:kind:> = 18(magtape):
                    6 (erase)              -      <:era:>
                    8 (move)               -      <:mov:>
                   10 (write tape mark)    -      <: tm:>
                   12 (set mode)           -      <:set:>
               andre værdier udskrives som integer;
               hvis den efterfølgende <:oper:> er den samme, udskrives <: - :>;
   obs obs     der kan forekomme værdier, der ikke findes i de respektive
               ref' er; i disse tilfælde vil informationen under <:message:>
               være irrelevant som message, da det vil være en kopi af
               de 4 første ord under <:answer:>;

<:mode:>       := mode;
               hvis <:kind:> = 18(magtape) er
                    mode = trail + density + parity
               inden udskrivning maskes trail fra;
               de resterende muligheder er
                    0  pe  + odd   udskrives  <:pe:>
                    2  pe  + even      -      <:pee:>
                    4  nrz + odd       -      <:nrz:>
                    6  nrz + even      -      <:nrze:>
               vedr. trail: se under  m e s s a g e <:4.word:>;
               øvrige <:mode:> udskrives som integer;
               hvis den efterfølgende <:mode:> er den samme, udskrives <: - :>;

<:2.word:>
<:3.word:>
<:4.word:>     := betydningen af disse er afhængig af <:oper:>;
               hvis <:oper:> er <:inp:> eller <:out:>, genereres <:4.word:>
               af udskrift-programmet "outrclog", dog ikke hvis <:kind:> = 6
               (rc3600-disc);
               for <:inp:> og <:out:> gælder følgende:
                    <:2.word:> = first core address;
                    <:3.word:> = last  core address;
                    <:4.word:> = buffer-size i karakter;
               <:4.word:> udregnes på følgende måde:
                 ( (<:3.word:> - <:2.word:>) + 2)/ 2 * 3;
               hvis <:kind:> = 18(magtape) fratrækkes yderligere trail;
               <:4.word:> sammenlignes med  a n s w e r <:char:>;
               afhængig af sammenligningen udskrives foran <:4.word:>:
                    <: - :> , hvis <:4.word:> er større end <:char:>
                    <:   :> , hvis      -     er lig med        -
                    <: + :> , hvis      -     er mindre end     -
\f



< : a n s w e r :>

<:status 0:11:>:= statusbit 0 til 11; 
               betydningen er afhængig af <:kind:>, men normalt betyder de:

                    0  intervention
                    1  parity error
                    2  timer
                    3  data overrun
                    4  block length error
                    5  end of tape
                    6  begin of tape
                    7  tape mark
                    8  write enable
                    9  mode error
                   10  read error (cardreader)
                   11  card reject or disc error

               bit 1,2,3,4,9,10 eller 11 vil altid forekomme;

<: 12:23 :>    := bør altid være  0;

<:halfw:>      := number of halfwords;
               antal halvord, der har været berørt ved operationen;

<:char:>       := number of characters;
               antal karakterer, der har været berørt ved operationen;

<:4.word:>
<:5.word:>     := hvis <:kind:> = 18(magtape) angiver
                     <:4.word:> = file number
                     <:5.word:> = block number
\f


4.5   break
-----------

ref.1.

     en error-record består af 1 linie, der læses ud fra overskriften (linie 3);

<:procname:>   := name of process;
               navnet på den interne process, som har fået et break;

<:w0:>
<:w1:>
<:w2:>
<:w3:>
<:status:>
<:ic:>
<:cause:>
<:sb:>         := de forskellige registre på break-tidspunktet;
               udskrives som integer;
               <:cause:> angiver, hvilken break, det drejer sig om;

<:(ic-4):>
<:(ic-2):>     := <:(ic-2):> er den sidste instruktion, der er udført;
               udskrives som integer;
               omskrives til instruktion v.h.a. do:

                    do w0.<:(ic-2):> write w0.code

               hvis <:(ic-2):> er negativt:

                    do w0.0.de.abs<:(ic-2):> write w0.code

               break 6  (<:cause:> = 6 ) vil være den hyppigst forekomne;
               break 6 er monitor-genereret og betyder parameter-fejl i
               monitor-kald;
               det vil normalt fremgå af <:sb:>, hvilket monitor-kald, det
               drejer sig om:

                   monitor-kald  =  2048  -  abs( <:sb:> );

                   hvis <:sb:> f.eks. er  -2030, vil sidste instruktion
                   være        jd    1<11  + 18   ( wait answer );
\f


5.0   rclog
===========


      "rclog" er et newjob, der sørger for diverse messages til "errorsnoop"
      og kald af "outrclog";


      husk:      at indsætte et brugbart

                     user-name og project-number

                 i 1.linie af "rclog";

      vedr. kald af "rclog" under boss og s, se under henholdsvis 2.2 og 2.3;
      "rclog" bør justeres inden kald under sos;


      "rclog" gør følgende:

           hvis "errorsnoop" eksisterer,
               sendes en stop-message til "errorsnoop",
               result og number of error-records udskrives;
           current output forsøges ændret til lp,
           hvis det ikke lykkes,
               ændres current output til "log", en bs-fil;
           dernæst kaldes udskriftprogrammet:
               outrclog rclogarea.andet
           current output ændres til c;
           hvis "errorsnoop" eksisterer,
               sendes en start-message til "errorsnoop",
               result udskrives;
           convert til "log";

      problem:

           hvis "rclogarea" ikke er blevet udskrevet inden en evt. autoload,
           bør man inden start af "errorsnoop" kalde "rclog".
\f


a.    referencer
================


           1.   rcsl no 42-i1235:
                rc8000 computer family
                reference manual

           2.   rcsl no 30-m43:
                dsc801, disc storage controller
                reference manual

           3.   rcsl no 52-aa661:
                fpa801, front end processor adaptor
                reference manual

           4.   rcsl no 31-d496:
                fpa line control protocol

           5.   rcsl no 31-d539:
                rc8000 backing storage area process

           6.   rcsl no 31-d528:
                rc8000 disc process

           7.   rcsl no 31-d546:
                rc8000 disc process (rc36xx)

           8.   rcsl no 31-d580:
                rc8000 terminal process

           9.   rcsl no 31-d535:
                rc8000 paper tape reader process

          10.   rcsl no 31-d534:
                rc8000 paper tape punch process

          11.   rcsl no 31-d536:
                rc8000 line printer process

          12.   rcsl no 31-d537:
                rc8000 punched card reader process

          13.   rcsl no 31-d533:
                rc8000 magnetic tape process (9-track)

                rcsl no 31-d540:
                rc8000 magnetic tape process (7-track)

          14.   rcsl no 31-d542:
                rc8000 cassette tape process

          15.   rcsl no 31-d543:
                flexible disc process

          16.   rcsl no 31-d624:
                errorlog process
\f


b.   error-records formater, som  "error-log"  afleverer dem:
=============================================================

      disc:

        +  0: <kind=62><local kind=0>
        +  2: <proc name>
        +  4: <  -   -  >
        +  6: <  -   -  >
        +  8: <  -   -  >
        + 10: <operation><mode>
        + 12: <first address>
        + 14: <segment no>
        + 16: <trans segm><not used>
        + 18: <io result>
        + 20: <remaining byte count>
        + 22: <current status>
        + 24: <event status>
        + 26: <detailed status>
        + 28: <current process>
        + 30: <time>
        + 32: <  - >


      fpa:

        +  0: <kind=86(rec)/88(tra)><local kind=0>
        +  2: <proc name>
        +  4: <  -   -  >
        +  6: <  -   -  >
        +  8: <  -   -  >
        + 10: <ch.prog.counter>    (std.status)
        + 12: <remaining byte count>
        + 14: <current status>
        + 16: <event status>
        + 18: <ch.prog.counter>    (1.sense)
        + 20: <remaining byte count>
        + 22: <current status>
        + 24: <event status>
        + 26: <start byte><status byte>
        + 28: <current process>
        + 30: <time>
        + 32: <  - >
        + 34: <ch.prog.counter>    (2.sense)
        + 36: <remaining byte count>
        + 38: <current status>
        + 40: <event status>
        + 42: <1.ch.command>
        + 44: <  -     -   >
        + 46: <  -     -   >
        + 48: <2.ch.command>
        + 50: <  -     -   >
        + 52: <  -     -   >
        + 54: <3.ch.command>
        + 56: <  -     -   >
        + 58: <  -     -   >
        + 60: <4.ch.command>
        + 62: <  -     -   >
        + 64: <  -     -   >
        + 66: <5.ch.command>
        + 68: <  -     -   >
        + 70: <  -     -   >
        + 72: <not used>
\f



      subprocess:

        +  0: <kind=84/85><local kind>
        +  2: <proc name>
        +  4: <  -   -  >
        +  6: <  -   -  >
        +  8: <  -   -  >
        + 10: <message +  8>
        + 12: <   -    + 10>
        + 14: <   -    + 12>
        + 16: <   -    + 14>
        + 18: <answer  +  8>
        + 20: <   -    + 10>
        + 22: <   -    + 12>
        + 24: <   -    + 14>
        + 26: <   -    + 16>
        + 28: <current process>
        + 30: <time>
        + 32: <  - >


      break:

        +  0: <kind=0><local kind=0>
        +  2: <proc name>
        +  4: <  -   -  >
        +  6: <  -   -  >
        +  8: <  -   -  >
        + 10: <w0>
        + 12: <w1>
        + 14: <w2>
        + 16: <w3>
        + 18: <status>
        + 20: <ic>
        + 22: <cause>
        + 24: <sb>
        + 26: <word(ic-4)>
        + 28: <word(ic-2)>
        + 30: <time>
        + 32: <  - >
\f


c.   disc
---------
<:io:>         := io result;
                    0 normal termination      ; interrupt received
                    1 bus reject, busy        ; device not started.(ex.bit 23)
                    2 bus timeout, disconnect ; device not started.(ex.bit 22)
                    3 software timeout        ; no interrupt received
                    4 abnormal termination    ; interrupt received
                    5 waitprogram terminated  ; interrupt received
                    6 power restart           ; software generated

fpa
---
<:start:>      := start byte;
                    bit 0  :  blocknumber
                     -  4  :  data follows
                     -  5  :  header bit
                     -  6  :  data flag
                     -  7  :  special function
               special funktioner er:
                    1 1 1 1 1 1 1 1      master clear
                    1 1 0 1 1 1 1 1      accept master clear

<:statu:>      := status byte;
                    bit 0  :  blocknumber
                     -  4  :  block control
                     -  5  :    -      -
                     -  6  :  blocklength error
                     -  7  :  parity error
               blockcontrol indeholder acceptance eller rejection af en
               modtaget header; feltet er dummy, hvis parity-bit er sat;
               blockcontrol kan have følgende værdier og betydning:
                    0  accepted
                    1  wait; operationen kan ikke blive modtaget i øjeblikket,
                       p.gr.a. manglende ressourcer i frontend;
                    2  skip; header og data bør skippes;
                    3  reject; uforståelig funktion eller linien ikke initieret;

subprocess
----------
<:kind:>       := subkind;
                    0 general sequential device
                    4 area-process
                    6 disc
                    8 typewriter
                   10 papertape reader
                   12 papertape punch
                   14 lineprinter
                   16 cardreader
                   18 magnetic tape or casette
                   22 diskette

<:status 0:11:>:= statusbit 0 til 11; 
                    0  intervention
                    1  parity error
                    2  timer
                    3  data overrun
                    4  block length error
                    5  end of tape
                    6  begin of tape
                    7  tape mark
                    8  write enable
                    9  mode error
                   10  read error (cardreader)
                   11  card reject or disc error
               bit 1,2,3,4,9,10 eller 11 vil altid forekomme;
#
\f


; ehp 810302
;
mode list.yes

rclogarea=set 108 disc
scope user rclogarea

watchdog=set 2 disc
(watchdog=slang
watchdog)

; ehp 1981.03.02
;
; version 1981.03.02
;
; 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 run bs disc 0 0
;
;
; 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,b35,e5,i35            ; begin
w.                         ;
  a0 = 510                 ; size of error log buffer
;***output-terminal:
  a1 = 2<6                 ; device no of output-terminal shift 6
  a2 = 74                  ; size of max record
  a3 = 34                  ; size of std record
  a4 = 32                  ; addr(time in record)

  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
  b7: 0                    ; size of log area
  b8: 0                    ; message buffer address
  b9: 0,r.8                ; answer
  b10:0,0,0,0              ; name of console
      0                    ;  used by send message
  b11:5<12                 ; console message
      0                    ;  first address
  b12:0                    ;  last address
  b13:0                    ; console proc descr. addr.
  b29:1<20                 ; data overrun(event status - disc)
  b35:1<21                 ; timeout(event status - transmit)

  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


; 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.                         ; begin
w.i1:                      ; out segment:
      rs. w3  i0.          ;   save link;
      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);
      bz. w1  b9.          ;
      sn  w0  1            ;   if result <> 1
      se  w1  0            ;   or status <> 0 then
      jl.     i17.         ;     goto type stop;
      wa. w0  b6.          ;
      rs. w0  b6.          ;   segment no:= segment no + 1;
      jl.    (i0.)         ;   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.i6: al  w3  x3+1         ; check message1:
  i2: sn  w2  0            ; check message2:  if buf = 0 then
      jl.     i16.         ;     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  i0.          ;   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  i0.          ;   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.i8: 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.     i5.          ;   goto type3;
  i9: al. w1  b26.         ; type5:  first addr:= addr(<:proc:>);
      al. w2  b19.         ;   last addr:= addr(nl);
      jl.     i5.          ;   goto type3;
  i7: am      b20-b14      ; type4: text:= addr(outerror)
  i3: am      b14-b15      ; type1: or <:start:>
  i4: al. w1  b15.         ; type2: or <:stop:>;
      al  w2  x1+2         ;
  i5: ds. w2  b12.         ; type3:  save first and last address;
      rs. w3  i0.          ;   save link;
  j1: al  w0  0            ; repeat:
      rl. w1  b13.         ;   proc:= console descr. addr.;
;HCØ      rs  w0  x1+12        ;   reserver(proc):= 0;
      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.    (i0.)         ;   goto saved link;
e.                         ; end of type;

  i0:         0            ; saved link(common for i1.,i2.,i3.,i4., and i.)


; central code: 
;
w.i10:                     ; wait for start:
      al  w2  0            ;   event:= 0;
      jd      1<11+24      ;   wait event(event;result,next);
      jl. w3  i6.          ;   check message1(buf,link;switch);
      jl.     i10.         ;     if rejected then goto wait for start;
      sl  w0  0            ;   if switch < 0
      sl  w0  11           ;   or switch >= 11 then
      jl.     i21.         ;     goto start;
      se  w0  0            ;   if switch <> 0 then
      am      i7-i9        ;     type4(outerror,link)
      jl. w3  i9.          ;   else type5(proc,link);
      jl.     i10.         ;   goto wait for start;
  i21:al. w3  b3.          ; start:
      jd      1<11+8       ;   reserve process(name;result);
      se  w0  0            ;   if result <> 0 then
      jl.     i17.         ;     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  i1.          ;   out segment(link);
  i11:                     ; type start:
      jl. w3  i3.          ;   type1(<:start:>,link);
  i12:                     ; 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.     i23.         ;   goto clear;
  i22:jl. w3  i8.          ; check:  checkout(link);
  i23: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;
  i15:                     ; wait event0:
      al  w2  0            ;   event:= 0;
  i16:jd      1<11+24      ; wait event:  wait event(event;result,buf);
      se  w0  1            ;   if result <> 1 then
      jl.     i18.         ;     goto exam message;
      rl  w0  x2+4         ;   result:= receiver(buf);
      jd      1<11+26      ;   get event(buf);
      se  w0  1            ;   if result <> 1 then
      jl.     i17.         ;     goto type stop;
      rl. w1  b2.-2        ;   addr:= first addr(error log mess);
      bz  w0  x1+0         ;   kind:= byte(addr);
      sl  w0  84           ;   if kind < 84
      sl  w0  86           ;   or kind >= 86 then
      jl.     i28.         ;     goto disc;
      bz  w3  x1+1         ;   localkind:= byte(addr+1);
      se  w3  8            ;   if localkind <> 8 then
      jl.     i26.         ;     goto magtape;
      bz  w3  x1+18        ;   status:= byte(addr+18);
;***terminal: (2 lines)
      sn  w3  1<9          ;   if status = timer then
      jl.     i23.         ;     goto clear;
      jl.     i29.         ;   goto update;
  i26:                     ; magtape:
;***magtape: (1 line)
      se  w3  18           ;   if localkind <> 18 then
      jl.     i29.         ;     goto update;
  i27:rl  w3  x1+2         ; name:
      sn. w3 (b22.)        ;   if word(addr+2) = <:wrk:> then
      jl.     i23.         ;     goto clear;
      jl.     i29.         ;   goto update;
  i28:se  w0  62           ; disc:  if kind <> 62 then
      jl.     i24.         ;     goto tra;
      rl  w3  x1+24        ;
      la. w3  b29.         ;
;***disc: (3 lines)
      se  w3  0            ;   if event status(record) <> 0 then
      jl.     i23.         ;     goto clear;
      jl.     i27.         ;   goto name;
  i24:se  w0  88           ; tra:  if kind <> 88 then
      jl.     i29.         ;     goto update;
      rl  w3  x1+18        ;
      rl  w2  x1+24        ;   event:= event status(first sense)
      ws. w2  b35.         ;     - timeout;
;***fpa: (3 lines)
      se  w3  0            ;   if channel(first sense) = 0
      sn  w2  0            ;   or event = 0 then
      jl.     i23.         ;     goto clear;
  i29:                     ; 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;
      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;
      ds. w3  b2.          ;   save first and last addr;
      sh. w3 (b5.)         ;   if last addr <= last addr(log area mess) then
      jl.     i22.         ;     goto check;
      jl. w3  i8.          ;   checkout(link);
      jl. w3  i1.          ;   out segment(link;segment no);
      sh. w0 (b7.)         ;   if segment no <= size of log area then
      jl.     i12.         ;     goto init;
  i17:                     ; type stop:
      al. w3  b3.          ;
      jd      1<11+10      ;   release process(name);
      jl. w3  i4.          ;   type2(<:stop:>,link);
      jl.     i10.         ;   goto wait for start;
  i18:                     ; exam message:
      jl. w3  i2.          ;   check message2(buf,link;switch);
      jl.     i15.         ;     if rejected then goto wait event0;
      se  w0  0            ;   if switch <> 0 then
      jl.     i30.         ;     goto check10;
      rl. w2  b8.          ;   buf:= saved buf address;
      jd      1<11+82      ;   regret message(buf);
      jl. w3  i9.          ;   type5(proc,link);
      jl.     i23.         ;   goto clear;
  i30:se  w0  10           ; check10:  if switch <> 10 then
      jl.     i19.         ;     goto stop;
      jl. w3  i7.          ;   type4(outerror,link);
      jl.     i15.         ;   goto wait event0;
  i19:rl. w2  b8.          ; stop:  buf:= saved buf address;
      jd      1<11+82      ;   regret message(buf);
      jl. w3  i1.          ;   out segment(link);
      jl.     i17.         ;   goto type stop;
;
; end of central code;

  i20:        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.
;
w.g5:                      ; entry point:
      al  w1  a1           ;   proc:=
      ls  w1  -5           ;     word(device no of output-terminal * 2
      wa  w1  74           ;     + first device in name table);
      rl  w1  x1+0         ;
      rs. w1  b13.         ;   output-terminal descr. addr.:= proc;
      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.     e0.          ;     goto error0;
      al. w3  b3.          ;
      al. w1  g5.-20       ;
      jd      1<11+42      ;   lookup entry(tail,name;tail);
      rl  w1  x1+0         ;
      al  w1  x1-1         ;
      rs. w1  b7.          ;   size of log area:= size(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.     e1.          ;     goto error1;
      am     (66)          ;
      rl  w1  24           ;   top address:= top address(own process);
      al. w2  i20.         ;   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.     e2.          ;     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  i1.          ;   out segment(link);
      jl.     i11.         ;   goto type start;

  b30:<:no errorlog        <10>:>
  b31:<:no rclogarea       <10>:>
  b32:<:proc size too small<10>:>

  e0: am      b30-b31      ; error0:  text:= (b30:b31)
  e1: am      b31-b32      ; error1:   or    (b31:b32)
  e2: al. w1  b32.         ; error2:   or    (b32:e0)
      al  w2  x1+12        ;
      jl. w3  i5.          ;   type3(text,link);
      jl      -1           ;   running after error;

; 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
\f


outrclog=set 60 disc
outrclog=algol


begin

   <*  ehp  810302

      program til udskrivning af error log from drivers.

      programkald  :  programnavn  errorlog.tt
            tt  ::=   test / andet

      error loggen består af et antal poster i en bs-fil

      første segment indeholder kun 1 post,der alene angiver et starttidspunkt.


      hvis filen er helt fyldt op, findes der ikke nogen slutmarkering.
      posterne i filen er sorteret i tidsrækkefølge, mens udskriften skal
      være opdelt efter devicenummer.
      devicenummeret står desværre ikke i posten, men skal søges i monitorens
      devicetabel.
      der er en entydig sammenhæng mellem devicenr. og procesbeskrivelsesadressen
 
      men det er naturligvis vigtigt, at det er den samme monitor
      ved udskrivningen som ved genereringen af posterne.

      udskriften omfatter 4 grupper:
           1) disc,  2) fpa,  3) subprocess  og  4)  break.

      poster med name1 = <:wrk:> udskrives ikke.


   *>
\f


integer i,ii,j,jj,adr,hash,bit,
        post,postantal,
        maxdev, <* antallet af devicenumre i monitoren *>
        specdev, <* antallet af specielle typer *>
        devno,kind,local_kind,gllocal_kind,
        segmprcyl,segmprhead,cyl,head,sector,rest,
        oper,mode,
        stdrec,maxrec,
        gloper,glmode,
        beregnet_char,
        command,
        linietæller,sidetæller,maxlinier,
        maxhash; <* et tal >= maksimale antal forskellige forekommende processer *>

real dato,kl,kl1,s_dato,s_kl,mill,cpu,rtid,tid,gltid,starttid;

boolean ff,nl,sp,
        test,
        disc, fpa, sub,
        tape, disc3600, card;

integer field førsteord,
              current_proc;

long array field procnavn;

integer array field word;

long field time;

long array glnavn(1:2), monnavn(1:2);

integer array core(0:20);


<* bestemmelse af størrelse på devicetabellen *>

system(5,74 <* første device i navnetabellen *>, core);

maxdev := ( core(1) - core(0) )/2;

specdev  := 47;

system(5,1192,monnavn);

if monnavn(1) = long <::> then
   monnavn(1):= long <:rc8000:>;

systime(1,0,mill);   dato := systime(4,mill,kl);

stdrec := 34;
maxrec := 74;
procnavn   := 0;
førsteord  := 2;
word       := 8;
current_proc := 28;
time         := 32;


maxlinier := 48;  <* udskriftslinier pr side *>

maxhash := 70;

nl := false add 10; sp := false add 32; ff := false add 12;

\f


begin
  
   integer array procadr(0:maxdev+specdev),
                 <* monitorens devicetabel + special devices *>
                 hashproc(0:maxhash);
                 <* hjælpetabel til undersøgelse af om en procadr er behandlet *>

   zone fil(2*128,2,ende);

   procedure ende(z,s,b);
   zone z; integer s,b;

      if s extract 1 = 1 then stderror(z,s,b) else 
      begin
         <* ikke flere poster *>

         goto gennemløb_slut;

      end;

   integer procedure beregn_hash(adr);
   value adr;  integer adr;
   begin

      <* proceduren finder adr eller en tom plads i tabellen hashproc  *>

      integer h,t;

      h:=(adr shift (-1)) mod maxhash -1;

      t:=0;  <* t skal forhindre cykling i fyldt hashproc tabel *>

      for h:=(h+1) mod maxhash while t<=maxhash  and
         adr <> hashproc(h)   and  -1 <> hashproc(h)   do  t:= t+1;

      if t>maxhash  then system(9,adr,<:<10>prog.f:>);

      beregn_hash := h;

   end procedure beregnhash;


   <* indlæsning af fp-kaldet og åbning til errorloggen *>

   begin
      array navn(1:2);

      test := system(4,2,navn) = 8 shift 12 + 10  <*  . navn *>  and
              navn(1) = real <:test:> ;

      system(4,1,navn);

      i:= 1;
      open(fil,4,string navn(increase(i)),1 shift 18);
   end;

   <* find adressen på første device i monitorens navnetabel,
      og hent procesbeskrivelsesadresserne
   *>

   system(5,74 <* first dev i navnetabel *>, core );

   system(5,core(0),procadr);

   <* procadr(0:maxdev-specdev) indeholder nu adresser på alle devices 
      i monitoren.
      procadr(maxdev+1:maxdev+specdev) skal bringes til at indeholde 
      de mulige andre tal,
      der kan forekomme i current proc feltet.
      i første omgang anvendes tallene fra 0 - 16.
   *>

   for i:=1 step 1 until specdev do procadr(i+maxdev) := i -1;


   <* div initialiseringer før den centrale løkke *>

   if test then
   begin
      write(out,nl,5,<:navnetabel:>);

      for i:=0 step 1 until maxdev + specdev do
         write(out,nl,1,<<  ddd>,i,<<  dddddd>,procadr(i));
      cpu:=systime(1,0,rtid);
   end;

   for i:= maxhash step -1 until 0 do hashproc(i) := -1;

   <* indlæsning af start tidspunktet  *>

   inrec_6(fil,2);
   inrec_6(fil,stdrec-2);

   starttid:= fil.time;
   s_dato := systime(4,fil.time/10000,s_kl);


   <* først undersøges hvilke devicenumre der forekommer i filen.
       adresserne indsættes i hashproc tabellen 
   *>

   postantal := 0;

   setposition(fil,0,1);

   for j:= 1 step 1 until 500000 do
   begin
      setposition(fil,0,j);
      i:= - stdrec;

      for i:= i + stdrec while (512 - i) >= maxrec do
      begin
         inrec_6(fil,2);

         kind:= fil.førsteord shift (-12);
         local_kind:= fil.førsteord extract 12;

         if kind = 86 or kind = 88 then
         begin
           inrec_6(fil,maxrec-2);
           i:= i + maxrec - stdrec;
         end
         else inrec_6(fil,stdrec-2);

         if local_kind = 25 or starttid > fil.time then
            goto gennemløb_slut;

         adr := fil.current_proc;

         if kind <> 0 then
         begin
            hash := beregn_hash(adr);
            hashproc(hash) := adr;
         end;

         postantal:= postantal + 1;

      end;

   end;

gennemløb_slut:

   if test then write(out,nl,2,<:postantal ::>,postantal);

 
   <* dernæst gennemløbes filen igen, en gang for hvert forekommende device *>

   for devno := 0 step 1 until maxdev + specdev do

   if hashproc( beregn_hash(procadr(devno))) <> -1 then
   begin

      <* start på nyt device *>

      linietæller := 10000; <* sideskift *>

      sidetæller := 1;

      if devno > maxdev then disc := fpa := sub := false
      else
      begin
         <* bestemmelse af kind *>
      
         system(5,procadr(devno),core);
 
         kind := core(0);

         disc := kind=62 and procadr(devno) >= 100;
         fpa  := kind=86 or kind=88 and procadr(devno) >= 100;
         sub  := -,disc and -,fpa and procadr(devno) >= 100;

         if kind = 62 then
         begin
            segmprcyl:= core(18);
            segmprhead:= core(16);
         end;

      end;
      
      <* markering i hashtabel  *>

      hash := beregn_hash(procadr(devno));

      hashproc(hash) := hashproc(hash) + 1_000_000;

      j:= 0;  ii:= 512;

      for post := 1 step 1 until postantal do
      begin

         ii:= ii + stdrec;
         if 512 - ii < maxrec then
         begin
            j:= j + 1;
            setposition(fil,0,j);
            ii:= 0;
         end;

         inrec_6(fil,2);

         kind:= fil.førsteord shift (-12);
         local_kind:= fil.førsteord extract 12;
         if kind = 86 or kind = 88 then
         begin
           inrec_6(fil,maxrec-2);
           ii:= ii + maxrec - stdrec;
         end
         else  inrec_6(fil,stdrec-2);
 
         if fil.current_proc = procadr(devno)
<***wrk-name: (2 linier) *>
         and
            (fil.procnavn(1) shift (-24) <> long <:wrk:> shift (-24)  ) 
         then
         begin

            <* udskrivning af post *>

            tape:= local_kind = 18 and sub;
            disc3600:= local_kind = 6 and sub;

            linietæller := linietæller + 1;

            if linietæller > maxlinier then
            begin

               <* overskrift *>

               writeint(out,ff,1);
               write(out,
                     sp,11-writeint(out,monnavn),
                     sp,32,<:period::>,sp,10);
               outdate(out,round s_dato);
               writeint(out,<:  :>);
               outdate(out,round s_kl  );
               writeint(out,<:    -    :>);
               outdate(out,round dato);
               writeint(out,<:  :>);
               outdate(out,round kl  );
               writeint(out,nl,2,<:error log for device no::>,
                     <<  ddd>,devno,sp,61,
                     <:page::>,<<       ddd>,sidetæller,nl,1);

               if sub then
               begin
                     writeint(out,nl,1,
                     <:kind procname    <----------- message ----------->:>,
                     sp,2,
                     <:<------------------- answer -------------------> :>,
                     <:date  and  time:>,
                     nl,2,sp,17,
                     <:oper.mode  2.word  3.word  4.word:>,sp,2,
                     <:status 0:11 12:23  halfw    char  4.word  5.word:>,nl,1);
               end
               else if disc then
                     writeint(out,nl,1,<:disc:       :>,
                     sp,42,<:<- cur ->  < event >  <------ detailed ------>:>,
                     nl,2,sp,54,
                     <:plswhm  d  iddhpcibb  fdpccdd.msd--a-+-wowvhsw:>,
                     nl,1,sp,54,
                     <:ooerio  e  naaaooruu  aroouaa.ueismtsohrfroeer:>,
                     nl,1,sp,54,
                     <:wceigd  v  tttrsmuss  ciwmitt.lcayatefeifrlaei:>,
                     nl,1,sp,10,<:first   first:>,sp,14,<:tra      remain  :>,
                     <:eakthe  .  eaadimptp  evemnaa.ttgnrerfatcdtdkt:>,
                     nl,1,
                     <:op.mode   addr.   segm. cyl hea sec  seg  io   char   :>,
                     <:rl e    k  reo tutia  ccccsco.ioncknvsdfyfff p:>,
                     sp,1,<:date  and  time:>,nl,1)

               else if fpa then
                     begin
                     writeint(out,nl,1);
                     writeint(out,
                     sp,11-writeint(out,fil.procnavn),
                     sp, 6,<:<cur> < event>:>,
                     sp,20,<:<cur> < event>:>,
                     sp,20,<:<cur> < event>:>,nl,2,
                     <:first             ddb  rptbbsbb:>,sp,3,
                     <:second            ddb  rptbbsbb:>,sp,3,
                     <:standard          ddb  rptbbsbb:>,nl,1,
                     <:sense             iel  eailutuu:>,sp,3,
                     <:sense             iel  eailutuu:>,sp,3,
                     <:status            iel  eailutuu:>,nl,1,
                                 sp,18,<:svo  srmosass:>,
                                 sp,21,<:svo  srmosass:>,
                                 sp,21,<:svo  srmosass:>,nl,1,
                                 sp,18,<:c..  eie.pttc:>,
                                 sp,21,<:c..  eie.pttc:>,
                                 sp,21,<:c..  eie.pttc:>,nl,1,
                     <:channel  rem.ch.  oko  ttolauio:>,sp,3,
                     <:channel  rem.ch.  oko  ttolauio:>,sp,3,
                     <:channel  rem.ch.  oko  ttolauio:>,sp,2,
                     <:date  and  time:>,nl,1);
                     end;

               linietæller :=
                  if sub then 9 else if disc then 13 else if fpa then 13 else 9;
               sidetæller := sidetæller + 1;

               <* dokumentnavnet samt datoen,operation og mode (og local_kind,
                  hvis sub) skal altid udskrives øverst på en ny side
               *>

               glnavn(1):= 0;  gltid := 0;
               gloper := glmode := -1;
               gllocal_kind := -1;

            end overskrift;

            writeint(out,nl,1);

            if sub then
              writeint(out,sp,5-(
              if gllocal_kind = local_kind then
              writeint(out,<:  -:>) else writeint(out,<<-dd>,local_kind) ) );

            gllocal_kind:= local_kind;

            if -,fpa and -,disc then
                  writeint(out,sp,11-(
                  if glnavn(1)=fil.procnavn(1) and glnavn(2)=fil.procnavn(2) then
                  writeint(out,<:   -:>)
                  else writeint(out,fil.procnavn)
                  ));

            if disc then
              begin
              if glnavn(1)<>fil.procnavn(1) or glnavn(2)<>fil.procnavn(2) then
                begin
                  writeint(out,fil.procnavn,nl,1);
                  linie_tæller:= linie_tæller + 1;
                  gloper:= -1;
                end
              end;

            glnavn(1) := fil.procnavn(1);
            glnavn(2) := fil.procnavn(2);

            if sub then
            begin

               <* operation og mode *>

               oper := fil.word(1) shift (-12);
               mode := fil.word(1) extract 12;

               if oper <> gloper then
               begin
                if tape then
                begin
                  if oper >= 0 and oper <= 14 then 
                      i := writeint(out,case oper+1 of(
                      <: sen:>,<::>,<::>,<: inp:>,
                      <::>,<: out:>,<: era:>,<::>,
                      <: mov:>,<::>,<: tm:>,<::>,
                      <::>,<::>,<: set:>))
                  else i:= 0;
                  if oper<0 or oper > 14 or i<1 then
                      writeint(out,<<-ddd>,oper)  else
                      writeint(out,sp,4-i);
                end
                else
                begin
                  if oper >= 0 and oper <= 5 then
                      i:= writeint(out,case oper+1 of(
                      <: sen:>,<::>,<::>,<: inp:>,
                      <::>,<: out:>))
                  else i:= 0;
                  if oper < 0 or oper > 5 or i < 1 then
                      writeint(out,<<-ddd>,oper)  else
                      writeint(out,sp,4-i);
                end;
                gloper := oper;
               end else
                  writeint(out,<:  - :>);

               if mode <> glmode 
                  or (oper <> 3 and oper <> 5 and oper <> 14) then
               begin

                  if oper = 3 <* inp *> or
                     oper = 5 <* out *> or
                     oper =14 <* set *> then
                  begin

                     if tape then
                      i := writeint(out,case (mode extract 3)+ 1 of(
                           <:  pe :>,<::>,<:  pee:>,<::>,
                           <:  nrz:>,<::>,<: nrze:>,<::>))
                     else  i := 0;

                     if i=0 then 
                      writeint(out,<<-dddd>,mode);

                     glmode := mode;

                  end
                  else
                  begin

                     glmode := -1;
                     
                     writeint(out,<<-dddd>,mode);

                  end;
               end else writeint(out,<:   - :>);


               writeint(out,sp,1,
                     <<-ddddddd>,fil.word(2),fil.word(3));

               if oper = 3 <* input *>
               or oper = 5 <* output *> and -,disc3600 then
               begin
                  <* i stedet for det irrelevatne word(message+14)
                     (= fil.word(4) ) udskrives et beregnet antal karakterer 
                  *>

                  beregnet_char :=
                     (fil.word(3)-fil.word(2)+2)*1.5
                     -(mode shift(-4)*((oper=5) <* output *> extract 1));

                  writeint(out,if beregnet_char = fil.word(7) then <:  :> else
                        if beregnet_char > fil.word(7) then <: -:> else <: +:>,
                        <<-ddddd>,beregnet_char,sp,2);

               end else
                     writeint(out,<<-ddddddd>,fil.word(4),sp,2);

               bit := fil.word(5);

               for i := 1 step 1 until 12 do
               begin
                  outchar(out,if bit < 0 then 49 <* 1 *> else 46 <* . *>);
                  bit := bit shift 1;
               end;

               bit:= fil.word(5) extract 12;
               writeint(out,<<-ddd>,bit);

               writeint(out,
                     <<-ddddddd>,fil.word(6),fil.word(7),
                                 fil.word(8),fil.word(9));

            end
            else if disc then
            begin

               <* operation *>

               oper := fil.word(1) shift (-12);
               if oper <> gloper then
               begin
                     if oper=3 then writeint(out,<:inp:>) else
                     if oper=5 then writeint(out,<:out:>) else
                     if oper=0 then writeint(out,<:sen:>) else
                     writeint(out,<<-dd>,oper);
                     gloper := oper;
               end
               else writeint(out,<: - :>);

               cyl:= fil.word(3)//segmprcyl;
               rest:= fil.word(3) mod segmprcyl;
               head:= rest//segmprhead;
               sector:= fil.word(3) mod segmprhead;

               writeint(out,<<-ddd>,fil.word(1) extract 12);

               writeint(out,
                     <<-ddddddd>,fil.word(2),
                                 fil.word(3),
                     <<-ddd>,    cyl,
                     <<-ddd>,    head,
                     (if fil.word(4) shift (-12) + sector <= segmprhead then <: :>
                      else <:*:>),
                     <<-dd>,     sector,
                     <<-dddd>,   fil.word(4) shift (-12),
                     <<-ddd>,    fil.word(5),
                     <<-ddddddd>,fil.word(6),
                     sp,2);

               bit := fil.word(7);

               for i:= 0 step 1 until 71 do
               begin

                  if i = 24 or i = 48 then
                  begin
                     writeint(out,sp,2);
                     bit := if i = 24 then fil.word(8) else fil.word(9);
                  end;

                  if i = 16 then
                  begin
                     writeint(out,<<-dd>,bit shift (-16));
                     i:= 23;
                  end;

                  jj:= case i + 1 of (
                        0, 0,-1,-1,-1, 0,-1,-1, 0, 0,
                        0,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                       -1,-1,-1,-1, 0, 0,-1, 0, 0, 0,
                       -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                       -1,-1,-1,-1, 0, 0, 0, 0, 0, 0,
                        0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                        0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                        0, 0);

                  if jj = 0 then
                    outchar(out,if bit < 0 then 49 <* 1 *> else 46 <* . *>);

                  bit := bit shift 1;

               end;

            end
            else if fpa then
            begin

              <* start byte, status byte og channel program *>

              writeint(out,nl,1,<:start :>);
              bit:= fil.word(9);
              for i:= 1 step 1 until 8 do
              begin
                 outchar(out,if bit < 0 then 49 else 46);
                 bit:= bit shift 1;
              end;

              writeint(out,nl,1,<:statu :>);
              bit:= fil.word(9) extract 12 shift 12;
              for i:= 1 step 1 until 8 do
              begin
                outchar(out,if bit < 0 then 49 else 46);
                bit:= bit shift 1;
              end;

              for i:= 17 step 3 until 29 do
              begin
                command:= fil.word(i) shift (-8) extract 3;
                writeint(out,case command + 1 of (
                  <:  sen:>,<:  rea:>,<:  *2*:>,
                  <:  wri:>,<:  wai:>,<:  *5*:>,
                  <:  con:>,<:  sto:>));
                if command = 0 then
                  writeint(out,<<-ddddddd>,fil.word(i+1));
                if command = 1 or command = 3 then
                  writeint(out,
                           <<d>,fil.word(i) shift (-7) extract 1,
                           <<-ddddddd>,fil.word(i+1),
                                       fil.word(i+2));
                if command = 7 then i:= 29;
              end;

              writeint(out,nl,1);

              for i:= 5,13,1 do
              begin
                writeint(out,<<-dddddd>,fil.word(i),sp,2,
                                        fil.word(i+1),sp,2);
                for jj:= 0,21,23 do
                  outchar(out,if fil.word(i+2) shift jj < 0 then 49 else 46);
                writeint(out,sp,2);
                for jj:= 0,1,2,4,20,21,22,23 do
                  outchar(out,if fil.word(i+3) shift jj < 0 then 49 else 46);
                if i <> 1 then writeint(out,sp,3);
              end;

              linietæller:= linietæller + 3;

            end;

            tid:=systime(4,fil.time/10000 +0.0,kl1);
            tid := round(tid) mod 10000  ;

            if tid <> gltid then
            write(out,<< dd.dd>,tid/100,sp,2) else
               writeint(out,<:   -    :>);

            outdate(out,round kl1);

            gltid := tid;

            <* slut med udskrift af linie *>

         end;
      
      end for post;
   end for devno;

   <* udskrift for special *>

   linietæller:= 10000;  <* sideskrift *>
   sidetæller:= 1;

   j:= 0;  ii:= 512;

   for post:= 1 step 1 until postantal do
   begin

      ii:= ii + stdrec;
      if 512 - ii < maxrec then
      begin
         j:= j + 1;
         setposition(fil,0,j);
         ii:= 0;
      end;

      inrec_6(fil,2);

      kind:= fil.førsteord shift (-12);
      if kind = 86 or kind = 88 then
      begin
         inrec_6(fil,maxrec-2);
         ii:= ii + maxrec - stdrec;
      end
      else  inrec_6(fil,stdrec-2);

      if kind = 0 then
      begin

         linietæller:= linietæller + 1;
         if linietæller > maxlinier then
         begin

            <* overskrift *>

            writeint(out,ff,1);
            writeint(out,
                  sp,11-writeint(out,monnavn),
                  sp,32,<:period::>,sp,10);
            outdate(out,round s_dato);
            writeint(out,<:  :>);
            outdate(out,round s_kl  );
            writeint(out,<:    -    :>);
            outdate(out,round dato);
            writeint(out,<:  :>);
            outdate(out,round kl  );
            writeint(out,nl,2,<:error log for special reasons:>,sp,61,
                  <:page::>,<<       ddd>,sidetæller,nl,2);

            writeint(out,<:procname:>,
            sp,3,
            <:       w0       w1       w2       w3:>,
            <:   status       ic    cause       sb:>,
            <:   (ic-4)   (ic-2) date  and  time:>,nl,1);

            linietæller:= 7;
            sidetæller:= sidetæller + 1;
            glnavn(1):= 0;  gltid:= 0;

         end overskrift;

         writeint(out,nl,1);

         writeint(out,sp,11-(
         if glnavn(1)=fil.procnavn(1) and glnavn(2)=fil.procnavn(2) then
         writeint(out,<:   -:>)
         else writeint(out,fil.procnavn)
         ));

         for i:= 1 step 1 until 10 do writeint(out,<< -ddddddd>,fil.word(i));

         tid:= systime(4,fil.time/10000 +0.0,kl1);
         tid:= round(tid) mod 10000;
         if tid <> gltid then
         write(out,<< dd.dd>,tid/100,sp,2) else
            writeint(out,<:   -    :>);

         outdate(out,round kl1);

         gltid:= tid;
      end;
   end;

   close(fil,true);

   if test then
   begin

      <* udskrift af hashtabel *>

      write(out,ff,1,<:testudskrift:>,nl,2,<:  nr   adresse:>);

      for i:= 0 step 1 until maxhash do
         writeint(out,nl,1,<< ddd>,i,<<  -dddddd>,hashproc(i));

      <* udskrift af tidsforbrug *>
      cpu:= systime(1,rtid,rtid) - cpu;
      write(out,nl,2,<:cpu og real tid :>,<<  dddd.d>,cpu,rtid);
   end;

   <* check af at alle current proc. er udskrevne  *>

   linietæller := 10000;

   for i := 0 step 1 until maxhash do
   if hashproc(i) <> -1 and hashproc(i) < 1_000_000 then
   begin

      <* en current proc uden udskriftsmarkering *>

      if linietæller > maxlinier then
      begin

         writeint(out,ff,1,
         <:the following current processes were not found in the monitor:>,nl,2);

         linietæller := 2;
 
      end;

      writeint(out,nl,1,<:current proc. ::>,hashproc(i));

      linietæller := linietæller + 1;

   end for i;

   if -,test then write(out,ff,1);

end;

end


scope user outrclog

\f


rclog=set 2 disc
rclog=copy ø.1
job user-name project-number time 10 01 output 500000     ; eks.  ehp 234567
do x3.errorsnoop process description,
if w0.ne.0,
   x1.0.stop,
   send message wait answer,
   write w0 x1.word.2 end,
fi,
exit

o lp
if ok.no
o log
outrclog rclogarea.andet
o c
do x3.errorsnoop process description,
if w0.ne.0,
   x1.0.start,
   send message wait answer,
   write w0 end,
fi,
exit

convert log
finis
ø

scope user rclog

lookup rclogarea watchdog outrclog rclog

end

finis
▶EOF◀